Come fare SE NON ESISTE in SQLite

Sto provando a porta di questa linea da MS SQL Server, SQLite

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

Sembra che SQLite non supporta SE NON ESISTE o almeno io non riesco a farlo funzionare.
Mi manca qualcosa di semplice? C’è una soluzione?

 

3 Replies
  1. 113

    Che ne dici di questo?

    INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

    (Non testati non ho SQLite… tuttavia questo link è abbastanza descrittivo.)

    Inoltre, questo dovrebbe funzionare anche:

    INSERT INTO EVENTTYPE (EventTypeName)
    SELECT 'ANI Received'
    WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');
    • Grazie. Tuttavia, va notato che INSERIRE O IGNORARE il pezzo funziona solo se EventTypeName è impostato per essere unico.
    • Vero. Ho pensato che era l’unica, data come è stato usato nell’esempio di SQL. Se non, il secondo metodo deve essere utilizzato.
    • Può il secondo metodo realmente essere utilizzato se EventTypeName non è unico? Sto cercando di fare qualcosa di simile e trovo che l’SELEZIONARE DOVE NON ESISTE clausola di restituzione di più righe, ogni riga in cui (l’equivalente di )EventTypeName != ‘ANI Ricevuto’ è vero.
    • L’intenzione è EventTypeName di essere unici. Il nuovo valore ‘ANI Ricevuto’ è solo inserita in tabella EVENTTYPE se non esiste già nella tabella. Questo è ciò che la DOVE NON ESISTE entra. SELEZIONARE DOVE NON ESISTE la clausola può restituire solo una singola riga; non c’è una clausola – non c’è modo più righe possono essere restituiti. Spero che questo cancella tutto.
    • Questo è molto cattivo stile di codifica. Ogni errore la query in modalità invisibile fallire! Dal docs: IGNORE Quando l’applicazione di un vincolo di violazione, l’IGNORARE algoritmo di risoluzione salta la riga che contiene la violazione del vincolo, e continua l’elaborazione righe successive dell’istruzione SQL come se niente è andato storto. Altre righe prima e dopo la riga che contiene la violazione del vincolo sono inserite o aggiornate normalmente. Nessun errore viene restituito quando si IGNORA l’algoritmo di risoluzione del conflitto è utilizzato.
    • questo è il punto. OP voluto inserire righe (le Chiavi Primarie, che non sia già presente nella tabella. OP non vuole che un errore per ogni violazione di Chiave Primaria. Questo emula il MS SQL codice per la domanda originale.

  2. 10

    Se si desidera ignorare l’inserimento del valore esistente, ci deve essere un campo Chiave della Tabella. Basta creare una tabella Con un Campo Chiave Primaria Come:

    CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

    E Quindi Inserire O Sostituire /Inserire O Ignorare Query sulla Tabella Come:

    INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

    Non ti Ri-Inserire La chiave Primaria Esistente di Valore… Questo È come si può Verificare Se un Valore è presente in tabella o non.

  3. 1

    È anche possibile impostare un Vincolo su una Tabella con i campi CHIAVE e impostare i Conflitti “Ignora”

    Quando l’applicazione di un vincolo di violazione, l’IGNORARE la risoluzione
    algoritmo salta la riga che contiene la violazione del vincolo e
    continua l’elaborazione righe successive dell’istruzione SQL come se
    nulla è andato storto. Altre righe prima e dopo la riga che conteneva
    la violazione del vincolo, sono inserite o aggiornate normalmente. Nessun errore
    restituiti quando IGNORA l’algoritmo di risoluzione del conflitto è utilizzato.

    SQLite Documentazione

Lascia un commento