2012-08-24 9 views
38

Sto provando a inserire i dati in una tabella. Vorrei inserire la riga se la colonna non ha già i dati, indipendentemente dalle altre colonne.sqlite - Come ottenere INSERT O IGNORE per lavorare

CREATE TABLE t (
    id   INTEGER PRIMARY KEY, 
    name  VARCHAR, 
    other  INT 
); 
INSERT OR IGNORE INTO t (name) VALUES ('a'); 
INSERT OR IGNORE INTO t (name) VALUES ('a'); 
INSERT OR IGNORE INTO t (name) VALUES ('a'); 

Con il frammento di cui sopra ho finito con 3 righe, non 1 come avrei pensato. Se è importante che l'attuale sql stia accadendo all'interno di un trigger INSTEAD OF INSERT, questo è solo un semplice caso di test.

risposta

65

Sostituire

CREATE TABLE t (
    id   INTEGER PRIMARY KEY, 
    name  VARCHAR, 
    other  INT 
); 

con

CREATE TABLE t (
    id   INTEGER PRIMARY KEY, 
    name  VARCHAR UNIQUE, 
    other  INT 
); 

quindi si otterrà

sqlite> CREATE TABLE t (
    ...>  id   INTEGER PRIMARY KEY, 
    ...>  name  VARCHAR UNIQUE, 
    ...>  other  INT 
    ...>); 
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a'); 
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a'); 
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a'); 
sqlite> select * from t ; 
1|a| 
9

che avrebbe funzionato solo per il campo chiave primaria o vincoli univoci:

La clausola di conflitto facoltativa consente la specifica di un algoritmo di risoluzione dei conflitti di vincolo alternativo da da utilizzare durante il comando durante lo .

Ulteriori:

La clausola ON CONFLICT applica a unico e non vincoli NULL (e per vincoli PRIMARY KEY, che ai fini della presente sezione sono la stessa cosa vincoli UNIQUE). L'algoritmo ON CONFLICT non si applica ai vincoli FOREIGN KEY. Sono disponibili cinque opzioni di risoluzione dell'algoritmo risoluzione : ROLLBACK, ABORT, FAIL, IGNORE e REPLACE. L'algoritmo predefinito per la risoluzione dei conflitti è ABORT.

Problemi correlati