В SQLite, когато се опитате да вмъкнете няколко реда в таблица и някой от тези редове нарушава ограничение за тази таблица, операцията ще се провали.
Това може да се очаква, в крайна сметка, за това е ограничението.
Но какво ще стане, ако просто искате да игнорирате всички редове, които нарушават ограниченията? С други думи, ако даден ред нарушава ограничение, искате SQLite да пропусне този ред, след което да продължи обработката на следващия ред и т.н.
За щастие има лесен начин да направите това в SQLite.
Клауза ON CONFLICT
SQLite има ON CONFLICT
клауза, която ви позволява да укажете как да се справите с конфликти на ограничения. По-конкретно, това се отнася за UNIQUE
, NOT NULL
, CHECK
и PRIMARY KEY
ограничения (но не и FOREIGN KEY
ограничения).
ON CONFLICT
клаузата се използва в CREATE TABLE
оператори, но при вмъкване на данни клаузата се заменя с OR
.
Следователно можете да използвате тази клауза, за да определите как да се справите с нарушенията на ограниченията при вмъкване на данни.
Има пет възможни стойности, които можете да използвате с тази клауза:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
За целите на тази статия ще използваме IGNORE
опция.
Използване на IGNORE
кара SQLite да пропусне единия ред, който съдържа нарушението на ограничението и да продължи обработката на следващите редове, сякаш нищо не се е объркало.
Пример
Ето CREATE TABLE
изявление за таблица, наречена Продукти :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Забележете, че тази таблица включва NOT NULL
ограничение за ProductName колона.
Сега нека се опитаме да вмъкнем данни, които нарушават това ограничение.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Резултат:
Error: NOT NULL constraint failed: Products.ProductName
Не е изненадващо, че получаваме грешка, показваща, че NOT NULL
ограничението е нарушено.
Сега нека видим колко реда бяха вмъкнати в таблицата.
SELECT COUNT(*) FROM Products;
Резултат:
0
Така че знаем, че само вторият ред е нарушил ограничението, но това е предотвратило някои данни от вмъкване.
Можем да променим това, като добавим OR IGNORE
към нашия INSERT
изявление:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Това е всичко, което се изисква. Изпълнението на този код не води до грешка като предишния код. Изпълнението на този код води до вмъкване на добрите данни и игнориране на лошите данни.
Сега, ако изпълним SELECT
изявление срещу таблицата, можем да видим, че добрите данни всъщност са били вмъкнати.
SELECT * FROM Products;
Резултат:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75