Résumé :dans ce tutoriel, vous apprendrez à utiliser SQLite CHECK
contrainte de valider les données avant insertion ou mise à jour.
Introduction à SQLite CHECK
contraintes
SQLite CHECK
les contraintes vous permettent de définir des expressions pour tester les valeurs chaque fois qu'elles sont insérées ou mises à jour dans une colonne.
Si les valeurs ne répondent pas aux critères définis par l'expression, SQLite émettra une violation de contrainte et abandonnera l'instruction.
Le CHECK
les contraintes vous permettent de définir des contrôles d'intégrité des données supplémentaires au-delà de UNIQUE
ou NOT NULL
pour répondre à votre application spécifique.
SQLite permet de définir un CHECK
contrainte au niveau de la colonne ou au niveau de la table.
L'instruction suivante montre comment définir un CHECK
contrainte au niveau colonne :
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
et la déclaration suivante illustre comment définir un CHECK
contrainte au niveau de la table :
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
Dans cette syntaxe, chaque fois qu'une ligne est insérée dans une table ou qu'une ligne existante est mise à jour, l'expression associée à chaque CHECK
contrainte est évaluée et renvoie une valeur numérique 0 ou 1.
Si le résultat est zéro, une violation de contrainte s'est produite. Si le résultat est une valeur différente de zéro ou NULL, cela signifie qu'aucune violation de contrainte ne s'est produite.
Notez que l'expression d'un CHECK
la contrainte ne peut pas contenir de sous-requête.
SQLite CHECK
exemples de contraintes
Prenons quelques exemples d'utilisation de CHECK
contraintes.
1) Utilisation de SQLite CHECK
exemple de contrainte au niveau de la colonne
L'instruction suivante crée une nouvelle table nommée contacts
:
CREATE TABLE contacts (
contact_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT,
phone TEXT NOT NULL
CHECK (length(phone) >= 10)
);
Code language: SQL (Structured Query Language) (sql)
Dans les contacts
table, le phone
la colonne a un CHECK
contrainte :
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Ce CHECK
La contrainte garantit que les valeurs du phone
la colonne doit comporter au moins 10 caractères.
Si vous tentez d'exécuter l'instruction suivante, vous obtiendrez une erreur de violation de contrainte :
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Voici le message d'erreur :
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
La raison en est que le numéro de téléphone que vous avez tenté d'insérer ne comporte que 9 caractères alors qu'il nécessite au moins 10 caractères.
L'instruction suivante devrait fonctionner car la valeur dans le phone
la colonne a 13 caractères, ce qui satisfait l'expression dans le CHECK
contrainte :
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) Utilisation de SQLite CHECK
contraintes au niveau de la table exemple
L'instruction suivante crée une nouvelle table nommée products
:
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
discount DECIMAL (10, 2) NOT NULL
DEFAULT 0,
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
);
Code language: SQL (Structured Query Language) (sql)
Dans cet exemple, le CHECK
contrainte est définie au niveau de la table :
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
Le CHECK
La contrainte garantit que le prix catalogue est toujours supérieur ou égal à la remise et que la remise et le prix catalogue sont supérieurs ou égaux à zéro.
La déclaration suivante enfreint le CHECK
contrainte car la remise est supérieure au prix catalogue.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
La déclaration suivante viole également le CHECK
contrainte car la remise est négative :
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Ajout de CHECK
contraintes à une table existante
Depuis la version 3.25.2, SQLite ne prend pas en charge l'ajout d'un CHECK
contrainte à une table existante.
Cependant, vous pouvez suivre ces étapes :
Tout d'abord, créez une nouvelle table dont la structure est la même que la table à laquelle vous souhaitez ajouter un CHECK
contrainte. Le nouveau tableau doit également inclure le CHECK
contrainte :
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Pour obtenir la structure de l'ancienne table, vous pouvez utiliser le .schema
commande. Consultez le didacticiel sur la table SQLite DESCRIBE pour plus d'informations.
Ensuite, copiez les données de l'ancienne table vers la nouvelle table.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
Troisièmement, supprimez l'ancienne table :
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
Quatrièmement, renommez la nouvelle table en l'ancienne :
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
Pour que toutes les déclarations ci-dessus soient sécurisées pour les transactions, vous devez toutes les exécuter dans une transaction comme celle-ci :
BEGIN;
-- create a new table
CREATE TABLE new_table (
[...],
CHECK ([...])
);
-- copy data from old table to the new one
INSERT INTO new_table SELECT * FROM old_table;
-- drop the old table
DROP TABLE old_table;
-- rename new table to the old one
ALTER TABLE new_table RENAME TO old_table;
-- commit changes
COMMIT;
Code language: SQL (Structured Query Language) (sql)
Dans ce tutoriel, vous avez appris à utiliser le SQLite CHECK
contrainte pour s'assurer que les valeurs d'une colonne ou d'un groupe de colonnes satisfont une condition définie par une expression.