Wanneer u in SQLite meerdere rijen in een tabel probeert in te voegen en een van die rijen schendt een beperking op die tabel, zal de bewerking mislukken.
Dit is te verwachten, daar is de beperking tenslotte voor.
Maar wat als u alleen rijen wilt negeren die beperkingen schenden? Met andere woorden, als een rij een beperking schendt, wilt u dat SQLite die rij overslaat, vervolgens doorgaat met het verwerken van de volgende rij, enzovoort.
Gelukkig is er een gemakkelijke manier om dit te doen in SQLite.
De ON CONFLICT-clausule
SQLite heeft de ON CONFLICT
clausule waarmee u kunt specificeren hoe beperkingsconflicten moeten worden afgehandeld. Meer specifiek is het van toepassing op UNIQUE
, NOT NULL
, CHECK
, en PRIMARY KEY
beperkingen (maar niet FOREIGN KEY
beperkingen).
De ON CONFLICT
clausule wordt gebruikt in CREATE TABLE
instructies, maar bij het invoegen van gegevens wordt de clausule vervangen door OR
.
Daarom kunt u deze clausule gebruiken om te bepalen hoe u moet omgaan met schendingen van beperkingen bij het invoegen van gegevens.
Er zijn vijf mogelijke waarden die u bij deze clausule kunt gebruiken:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
Voor de doeleinden van dit artikel gebruiken we de IGNORE
optie.
IGNORE
gebruiken zorgt ervoor dat SQLite de ene rij overslaat die de beperkingsschending bevat en doorgaat met het verwerken van volgende rijen alsof er niets mis is gegaan.
Voorbeeld
Hier is een CREATE TABLE
statement voor een tabel met de naam Producten :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Merk op dat deze tabel een NOT NULL
. bevat beperking op de ProductName kolom.
Laten we nu proberen gegevens in te voegen die die beperking schenden.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Resultaat:
Error: NOT NULL constraint failed: Products.ProductName
Het is niet verrassend dat we een foutmelding krijgen die aangeeft dat de NOT NULL
beperking is geschonden.
Laten we nu eens kijken hoeveel rijen er in de tabel zijn ingevoegd.
SELECT COUNT(*) FROM Products;
Resultaat:
0
We weten dus dat alleen de tweede rij de beperking schond, maar dit verhinderde elke gegevens worden niet ingevoegd.
We kunnen dit veranderen door OR IGNORE
toe te voegen naar onze INSERT
verklaring:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Dat is alles wat nodig is. Het uitvoeren van deze code resulteert niet in een fout zoals de vorige code. Als u deze code uitvoert, worden de goede gegevens ingevoegd en worden de slechte gegevens genegeerd.
Als we nu een SELECT
verklaring tegen de tabel, kunnen we zien dat de goede gegevens inderdaad zijn ingevoegd.
SELECT * FROM Products;
Resultaat:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75