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:
ROLLBACKABORTFAILIGNOREREPLACE
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