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

Contraintes SQLite CHECK

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.