sql >> Database >  >> RDS >> SQLite

Rijen overslaan die beperkingen schenden bij het invoegen van gegevens in SQLite

Wanneer u in SQLite meerdere rijen in een tabel probeert in te voegen en een van die rijen schendt een beperking op die tabel, zal de bewerking mislukken.

Dit is te verwachten, daar is de beperking tenslotte voor.

Maar wat als u alleen rijen wilt negeren die beperkingen schenden? Met andere woorden, als een rij een beperking schendt, wilt u dat SQLite die rij overslaat, vervolgens doorgaat met het verwerken van de volgende rij, enzovoort.

Gelukkig is er een gemakkelijke manier om dit te doen in SQLite.

De ON CONFLICT-clausule

SQLite heeft de ON CONFLICT clausule waarmee u kunt specificeren hoe beperkingsconflicten moeten worden afgehandeld. Meer specifiek is het van toepassing op UNIQUE , NOT NULL , CHECK , en PRIMARY KEY beperkingen (maar niet FOREIGN KEY beperkingen).

De ON CONFLICT clausule wordt gebruikt in CREATE TABLE instructies, maar bij het invoegen van gegevens wordt de clausule vervangen door OR .

Daarom kunt u deze clausule gebruiken om te bepalen hoe u moet omgaan met schendingen van beperkingen bij het invoegen van gegevens.

Er zijn vijf mogelijke waarden die u bij deze clausule kunt gebruiken:

  • ROLLBACK
  • ABORT
  • FAIL
  • IGNORE
  • REPLACE

Voor de doeleinden van dit artikel gebruiken we de IGNORE optie.

IGNORE gebruiken zorgt ervoor dat SQLite de ene rij overslaat die de beperkingsschending bevat en doorgaat met het verwerken van volgende rijen alsof er niets mis is gegaan.

Voorbeeld

Hier is een CREATE TABLE statement voor een tabel met de naam Producten :

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

Merk op dat deze tabel een NOT NULL . bevat beperking op de ProductName kolom.

Laten we nu proberen gegevens in te voegen die die beperking schenden.

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

Resultaat:

Error: NOT NULL constraint failed: Products.ProductName

Het is niet verrassend dat we een foutmelding krijgen die aangeeft dat de NOT NULL beperking is geschonden.

Laten we nu eens kijken hoeveel rijen er in de tabel zijn ingevoegd.

SELECT COUNT(*) FROM Products;

Resultaat:

0

We weten dus dat alleen de tweede rij de beperking schond, maar dit verhinderde elke gegevens worden niet ingevoegd.

We kunnen dit veranderen door OR IGNORE toe te voegen naar onze INSERT verklaring:

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

Dat is alles wat nodig is. Het uitvoeren van deze code resulteert niet in een fout zoals de vorige code. Als u deze code uitvoert, worden de goede gegevens ingevoegd en worden de slechte gegevens genegeerd.

Als we nu een SELECT verklaring tegen de tabel, kunnen we zien dat de goede gegevens inderdaad zijn ingevoegd.

SELECT * FROM Products;

Resultaat:

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


  1. Hilarische tweets over het leven van een DBA

  2. Hoe voeg ik een tekenreeks toe met een automatische verhogingswaarde in SQL Server?

  3. Hoe u de huidige datum en tijd kunt krijgen (zonder tijdzone) in PostgreSQL

  4. Hoe SQLite Total() werkt