Když se v SQLite pokusíte vložit více řádků do tabulky a kterýkoli z těchto řádků poruší omezení v této tabulce, operace se nezdaří.
To se dá očekávat, koneckonců k tomu slouží omezení.
Ale co když chcete ignorovat všechny řádky, které porušují omezení? Jinými slovy, pokud řádek porušuje omezení, chcete, aby SQLite tento řádek vynechal a pokračoval ve zpracování dalšího řádku a tak dále.
Naštěstí existuje snadný způsob, jak to udělat v SQLite.
Ustanovení ON CONFLICT
SQLite má ON CONFLICT
klauzule, která vám umožňuje určit, jak zacházet s konflikty omezení. Konkrétněji se vztahuje na UNIQUE
, NOT NULL
, CHECK
a PRIMARY KEY
omezení (ale ne FOREIGN KEY
omezení).
The ON CONFLICT
klauzule se používá v CREATE TABLE
příkazy, ale při vkládání dat je klauzule nahrazena OR
.
Proto můžete tuto klauzuli použít k určení, jak zacházet s porušením omezení při vkládání dat.
S touto klauzulí můžete použít pět možných hodnot:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
Pro účely tohoto článku budeme používat IGNORE
možnost.
Pomocí IGNORE
způsobí, že SQLite přeskočí jeden řádek, který obsahuje porušení omezení, a pokračuje ve zpracování následujících řádků, jako by se nic nedělo.
Příklad
Zde je CREATE TABLE
výpis pro tabulku s názvem Produkty :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Všimněte si, že tato tabulka obsahuje NOT NULL
omezení na Název produktu sloupec.
Nyní se pokusíme vložit data, která toto omezení porušují.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Výsledek:
Error: NOT NULL constraint failed: Products.ProductName
Není překvapením, že se zobrazí chyba označující NOT NULL
omezení bylo porušeno.
Nyní se podívejme, kolik řádků bylo do tabulky vloženo.
SELECT COUNT(*) FROM Products;
Výsledek:
0
Víme tedy, že pouze druhý řádek porušil omezení, ale to zabránilo jakémukoli vkládání dat.
Můžeme to změnit přidáním OR IGNORE
do našeho INSERT
prohlášení:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
To je vše, co je potřeba. Spuštění tohoto kódu nezpůsobí chybu jako předchozí kód. Spuštění tohoto kódu má za následek vložení dobrých dat a ignorování špatných dat.
Nyní, když spustíme SELECT
oproti tabulce můžeme vidět, že dobrá data byla ve skutečnosti vložena.
SELECT * FROM Products;
Výsledek:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75