SQLite
 sql >> Datenbank >  >> RDS >> SQLite

So überspringen Sie Zeilen, die beim Einfügen von Daten in SQLite gegen Einschränkungen verstoßen

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