Dans SQLite, lorsque vous essayez d'insérer plusieurs lignes dans une table et que l'une de ces lignes viole une contrainte sur cette table, l'opération échoue.
C'est normal, après tout, c'est à ça que sert la contrainte.
Mais que se passe-t-il si vous souhaitez simplement ignorer les lignes qui violent les contraintes ? En d'autres termes, si une ligne viole une contrainte, vous voulez que SQLite ignore cette ligne, puis continue à traiter la ligne suivante, et ainsi de suite.
Heureusement, il existe un moyen simple de le faire dans SQLite.
Clause EN CAS DE CONFLIT
SQLite a le ON CONFLICT
clause qui vous permet de spécifier comment gérer les conflits de contraintes. Plus précisément, cela s'applique à UNIQUE
, NOT NULL
, CHECK
, et PRIMARY KEY
contraintes (mais pas FOREIGN KEY
contraintes).
Le ON CONFLICT
la clause est utilisée dans CREATE TABLE
instructions, mais lors de l'insertion de données, la clause est remplacée par OR
.
Par conséquent, vous pouvez utiliser cette clause pour déterminer comment gérer les violations de contrainte lors de l'insertion de données.
Il existe cinq valeurs possibles que vous pouvez utiliser avec cette clause :
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
Pour les besoins de cet article, nous utiliserons le IGNORE
option.
Utiliser IGNORE
oblige SQLite à ignorer la ligne contenant la violation de contrainte et à continuer de traiter les lignes suivantes comme si de rien n'était.
Exemple
Voici un CREATE TABLE
déclaration pour une table appelée Produits :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Notez que cette table inclut un NOT NULL
contrainte sur le ProductName colonne.
Essayons maintenant d'insérer des données qui violent cette contrainte.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Résultat :
Error: NOT NULL constraint failed: Products.ProductName
Sans surprise, nous obtenons une erreur indiquant que le NOT NULL
contrainte a été violée.
Voyons maintenant combien de lignes ont été insérées dans le tableau.
SELECT COUNT(*) FROM Products;
Résultat :
0
Nous savons donc que seule la deuxième ligne a violé la contrainte, mais cela a empêché tout données d'être insérées.
Nous pouvons changer cela en ajoutant OR IGNORE
à notre INSERT
déclaration :
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
C'est tout ce qu'il faut. L'exécution de ce code n'entraîne pas une erreur comme le code précédent. L'exécution de ce code entraîne l'insertion des bonnes données et l'ignorance des mauvaises données.
Maintenant, si nous exécutons un SELECT
déclaration contre la table, nous pouvons voir que les bonnes données ont en fait été insérées.
SELECT * FROM Products;
Résultat :
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75