Wenn Sie in SQLite versuchen, mehrere Zeilen in eine Tabelle einzufügen, und eine dieser Zeilen gegen eine Einschränkung dieser Tabelle verstößt, schlägt die Operation fehl.
Das ist zu erwarten, schließlich ist die Einschränkung dafür da.
Aber was ist, wenn Sie einfach alle Zeilen ignorieren möchten, die gegen Einschränkungen verstoßen? Mit anderen Worten, wenn eine Zeile gegen eine Einschränkung verstößt, soll SQLite diese Zeile überspringen, dann mit der Verarbeitung der nächsten Zeile fortfahren und so weiter.
Glücklicherweise gibt es in SQLite eine einfache Möglichkeit, dies zu tun.
Die ON CONFLICT-Klausel
SQLite hat den ON CONFLICT
-Klausel, mit der Sie angeben können, wie Constraint-Konflikte behandelt werden sollen. Genauer gesagt gilt es für UNIQUE
, NOT NULL
, CHECK
, und PRIMARY KEY
Beschränkungen (aber nicht FOREIGN KEY
Beschränkungen).
Der ON CONFLICT
-Klausel wird in CREATE TABLE
verwendet Anweisungen, aber beim Einfügen von Daten wird die Klausel durch OR
ersetzt .
Daher können Sie diese Klausel verwenden, um festzulegen, wie mit Beschränkungsverletzungen beim Einfügen von Daten umgegangen werden soll.
Es gibt fünf mögliche Werte, die Sie mit dieser Klausel verwenden können:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
Für die Zwecke dieses Artikels verwenden wir IGNORE
Option.
Mit IGNORE
bewirkt, dass SQLite die eine Zeile überspringt, die die Einschränkungsverletzung enthält, und mit der Verarbeitung nachfolgender Zeilen fortfährt, als ob nichts schief gegangen wäre.
Beispiel
Hier ist eine CREATE TABLE
-Anweisung für eine Tabelle namens Products :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Beachten Sie, dass diese Tabelle ein NOT NULL
enthält Einschränkung für den ProductName Spalte.
Versuchen wir nun, Daten einzufügen, die gegen diese Einschränkung verstoßen.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Ergebnis:
Error: NOT NULL constraint failed: Products.ProductName
Es überrascht nicht, dass wir eine Fehlermeldung erhalten, die darauf hinweist, dass NOT NULL
Einschränkung wurde verletzt.
Sehen wir uns nun an, wie viele Zeilen in die Tabelle eingefügt wurden.
SELECT COUNT(*) FROM Products;
Ergebnis:
0
Wir wissen also, dass nur die zweite Zeile gegen die Einschränkung verstoßen hat, aber dies hat jeden verhindert Daten nicht eingefügt werden.
Wir können dies ändern, indem wir OR IGNORE
hinzufügen zu unserem INSERT
Aussage:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Das ist alles, was erforderlich ist. Das Ausführen dieses Codes führt nicht wie der vorherige Code zu einem Fehler. Das Ausführen dieses Codes führt dazu, dass die guten Daten eingefügt und die schlechten Daten ignoriert werden.
Wenn wir nun ein SELECT
ausführen Aussage gegen die Tabelle, können wir sehen, dass die guten Daten tatsächlich eingefügt wurden.
SELECT * FROM Products;
Ergebnis:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75