SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment ignorer les lignes qui violent les contraintes lors de l'insertion de données dans SQLite

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