In SQLite, quando si tenta di inserire più righe in una tabella e una qualsiasi di queste righe viola un vincolo su quella tabella, l'operazione avrà esito negativo.
C'è da aspettarselo, dopotutto, ecco a cosa serve il vincolo.
Ma cosa succede se si desidera ignorare qualsiasi riga che viola i vincoli? In altre parole, se una riga viola un vincolo, vuoi che SQLite salti quella riga, quindi continui a elaborare la riga successiva e così via.
Fortunatamente, c'è un modo semplice per farlo in SQLite.
La clausola SUL CONFLITTO
SQLite ha il ON CONFLICT
clausola che consente di specificare come gestire i conflitti di vincoli. Più specificamente, si applica a UNIQUE
, NOT NULL
, CHECK
e PRIMARY KEY
vincoli (ma non FOREIGN KEY
vincoli).
Il ON CONFLICT
La clausola è usata in CREATE TABLE
istruzioni, ma quando si inseriscono i dati, la clausola viene sostituita con OR
.
Pertanto, puoi utilizzare questa clausola per determinare come gestire le violazioni dei vincoli durante l'inserimento dei dati.
Ci sono cinque possibili valori che puoi usare con questa clausola:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
Ai fini di questo articolo, utilizzeremo IGNORE
opzione.
Usando IGNORE
fa in modo che SQLite salti l'unica riga che contiene la violazione del vincolo e continui a elaborare le righe successive come se nulla fosse andato storto.
Esempio
Ecco un CREATE TABLE
dichiarazione per una tabella denominata Prodotti :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Si noti che questa tabella include un NOT NULL
vincolo sul NomeProdotto colonna.
Ora proviamo a inserire dati che violano tale vincolo.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Risultato:
Error: NOT NULL constraint failed: Products.ProductName
Non sorprende che otteniamo un errore che indica che NOT NULL
vincolo è stato violato.
Ora vediamo quante righe sono state inserite nella tabella.
SELECT COUNT(*) FROM Products;
Risultato:
0
Quindi sappiamo che solo la seconda riga ha violato il vincolo, ma questo ne ha impedito qualsiasi dati dall'inserimento.
Possiamo cambiarlo aggiungendo OR IGNORE
al nostro INSERT
dichiarazione:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Questo è tutto ciò che serve. L'esecuzione di questo codice non genera un errore come il codice precedente. L'esecuzione di questo codice comporta l'inserimento di dati validi e l'ignoranza di quelli non validi.
Ora se eseguiamo un SELECT
dichiarazione contro il tavolo, possiamo vedere che i dati buoni sono stati effettivamente inseriti.
SELECT * FROM Products;
Risultato:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75