I SQLite, når du forsøger at indsætte flere rækker i en tabel, og enhver af disse rækker overtræder en begrænsning på den tabel, vil operationen mislykkes.
Dette kan forventes, det er trods alt det, begrænsningen er til.
Men hvad hvis du bare vil ignorere rækker, der overtræder begrænsninger? Med andre ord, hvis en række overtræder en begrænsning, vil du have, at SQLite springer over den række og derefter fortsætter med at behandle den næste række og så videre.
Heldigvis er der en nem måde at gøre dette på i SQLite.
ON CONFLICT-klausulen
SQLite har ON CONFLICT
klausul, der giver dig mulighed for at specificere, hvordan begrænsningskonflikter skal håndteres. Mere specifikt gælder det for UNIQUE
, NOT NULL
, CHECK
og PRIMARY KEY
begrænsninger (men ikke FOREIGN KEY
begrænsninger).
ON CONFLICT
klausul bruges i CREATE TABLE
sætninger, men når der indsættes data, erstattes klausulen med OR
.
Derfor kan du bruge denne klausul til at bestemme, hvordan du skal håndtere overtrædelser af begrænsninger, når du indsætter data.
Der er fem mulige værdier, du kan bruge med denne klausul:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
I forbindelse med denne artikel bruger vi IGNORE
mulighed.
Brug af IGNORE
får SQLite til at springe den ene række over, der indeholder begrænsningsovertrædelsen, og fortsætte med at behandle efterfølgende rækker, som om intet gik galt.
Eksempel
Her er en CREATE TABLE
sætning for en tabel kaldet Produkter :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Bemærk, at denne tabel indeholder en NOT NULL
begrænsning på Produktnavn kolonne.
Lad os nu prøve at indsætte data, der overtræder denne begrænsning.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Resultat:
Error: NOT NULL constraint failed: Products.ProductName
Ikke overraskende får vi en fejl, der indikerer, at NOT NULL
begrænsningen blev overtrådt.
Lad os nu se, hvor mange rækker der blev indsat i tabellen.
SELECT COUNT(*) FROM Products;
Resultat:
0
Så vi ved, at kun den anden række overtrådte begrænsningen, men dette forhindrede enhver data fra at blive indsat.
Vi kan ændre dette ved at tilføje OR IGNORE
til vores INSERT
erklæring:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Det er alt, der kræves. Kørsel af denne kode resulterer ikke i en fejl som den forrige kode. Kørsel af denne kode resulterer i, at de gode data indsættes, og de dårlige data ignoreres.
Hvis vi nu kører en SELECT
opgørelse mod tabellen, kan vi se, at de gode data faktisk blev indsat.
SELECT * FROM Products;
Resultat:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75>