sql >> Database teknologi >  >> RDS >> SQLite

Sådan springer du rækker over, der overtræder begrænsninger, når du indsætter data i SQLite

I SQLite, når du forsøger at indsætte flere rækker i en tabel, og enhver af disse rækker overtræder en begrænsning på den tabel, vil operationen mislykkes.

Dette kan forventes, det er trods alt det, begrænsningen er til.

Men hvad hvis du bare vil ignorere rækker, der overtræder begrænsninger? Med andre ord, hvis en række overtræder en begrænsning, vil du have, at SQLite springer over den række og derefter fortsætter med at behandle den næste række og så videre.

Heldigvis er der en nem måde at gøre dette på i SQLite.

ON CONFLICT-klausulen

SQLite har ON CONFLICT klausul, der giver dig mulighed for at specificere, hvordan begrænsningskonflikter skal håndteres. Mere specifikt gælder det for UNIQUE , NOT NULL , CHECK og PRIMARY KEY begrænsninger (men ikke FOREIGN KEY begrænsninger).

ON CONFLICT klausul bruges i CREATE TABLE sætninger, men når der indsættes data, erstattes klausulen med OR .

Derfor kan du bruge denne klausul til at bestemme, hvordan du skal håndtere overtrædelser af begrænsninger, når du indsætter data.

Der er fem mulige værdier, du kan bruge med denne klausul:

  • ROLLBACK
  • ABORT
  • FAIL
  • IGNORE
  • REPLACE

I forbindelse med denne artikel bruger vi IGNORE mulighed.

Brug af IGNORE får SQLite til at springe den ene række over, der indeholder begrænsningsovertrædelsen, og fortsætte med at behandle efterfølgende rækker, som om intet gik galt.

Eksempel

Her er en CREATE TABLE sætning for en tabel kaldet Produkter :

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price 
);

Bemærk, at denne tabel indeholder en NOT NULL begrænsning på Produktnavn kolonne.

Lad os nu prøve at indsætte data, der overtræder denne begrænsning.

INSERT INTO Products VALUES 
    (1, 'Widget Holder', 139.50),
    (2, NULL, 11.00),
    (3, 'Widget Stick', 89.75);

Resultat:

Error: NOT NULL constraint failed: Products.ProductName

Ikke overraskende får vi en fejl, der indikerer, at NOT NULL begrænsningen blev overtrådt.

Lad os nu se, hvor mange rækker der blev indsat i tabellen.

SELECT COUNT(*) FROM Products;

Resultat:

0

Så vi ved, at kun den anden række overtrådte begrænsningen, men dette forhindrede enhver data fra at blive indsat.

Vi kan ændre dette ved at tilføje OR IGNORE til vores INSERT erklæring:

INSERT OR IGNORE INTO Products VALUES 
    (1, 'Widget Holder', 139.50),
    (2, NULL, 11.00),
    (3, 'Widget Stick', 89.75);

Det er alt, der kræves. Kørsel af denne kode resulterer ikke i en fejl som den forrige kode. Kørsel af denne kode resulterer i, at de gode data indsættes, og de dårlige data ignoreres.

Hvis vi nu kører en SELECT opgørelse mod tabellen, kan vi se, at de gode data faktisk blev indsat.

SELECT * FROM Products;

Resultat:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  139.5     
3           Widget Stick   89.75     
>


  1. Forespørg på de sidste N relaterede rækker pr. række

  2. Sådan finder du ikke-numeriske værdier i en kolonne i MySQL

  3. 0 til 60 :Skift til indirekte kontrolpunkter

  4. Sådan tilføjes Active Directory-brugergruppe som login i SQL Server