В SQLite, когато се опитате да вмъкнете няколко реда в таблица и някой от тези редове нарушава ограничение за тази таблица, операцията ще се провали.
Това може да се очаква, в крайна сметка, за това е ограничението.
Но какво ще стане, ако просто искате да игнорирате всички редове, които нарушават ограниченията? С други думи, ако даден ред нарушава ограничение, искате SQLite да пропусне този ред, след което да продължи обработката на следващия ред и т.н.
За щастие има лесен начин да направите това в SQLite.
Клауза ON CONFLICT
SQLite има ON CONFLICT клауза, която ви позволява да укажете как да се справите с конфликти на ограничения. По-конкретно, това се отнася за UNIQUE , NOT NULL , CHECK и PRIMARY KEY ограничения (но не и FOREIGN KEY ограничения).
ON CONFLICT клаузата се използва в CREATE TABLE оператори, но при вмъкване на данни клаузата се заменя с OR .
Следователно можете да използвате тази клауза, за да определите как да се справите с нарушенията на ограниченията при вмъкване на данни.
Има пет възможни стойности, които можете да използвате с тази клауза:
ROLLBACKABORTFAILIGNOREREPLACE
За целите на тази статия ще използваме 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