sqlite – Come ottenere INSERT O IGNORA per lavorare

Sto cercando di inserire dati in una tabella. Vorrei inserire la riga se la colonna non ha già i dati, indipendentemente dalle altre colonne.

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 INSTEAD OF INSERT , questo è solo un semplice caso di test.

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 ); 

Allora otterrai

 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| 

Ciò funzionerebbe solo per il campo chiave primaria o per i vincoli univoci:

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

Ulteriore:

La clausola ON CONFLICT si applica ai vincoli UNIQUE e NOT NULL (e ai vincoli PRIMARY KEY che ai fini di questa sezione sono la stessa cosa dei vincoli UNIQUE). L’algoritmo ON CONFLICT non si applica ai vincoli FOREIGN KEY. Esistono cinque scelte dell’algoritmo di risoluzione dei conflitti: ROLLBACK, ABORT, FAIL, IGNORE e REPLACE. L’algoritmo predefinito per la risoluzione dei conflitti è ABORT.