SQLite
 sql >> Database >  >> RDS >> SQLite

Come saltare le righe che violano i vincoli durante l'inserimento di dati in SQLite

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