Aperçu des contraintes

Snowflake offre la fonctionnalité de contrainte suivante :

  • Types de contrainte du standard SQL ANSI. Pour plus d’informations, voir Types de contraintes pris en charge.

  • Contraintes nommées.

  • Contraintes pour une colonne et plusieurs colonnes.

  • Création de contraintes en ligne et hors ligne.

  • Création, modification et suppression des contraintes.

Pour plus d’informations, voir CREATE | ALTER TABLE … CONSTRAINT.

Types de contraintes pris en charge

Snowflake prend en charge les types de contraintes suivants de la norme ANSI SQL :

  • PRIMARY KEY : Garantit que toutes les valeurs d’une colonne sont distinctes et que la colonne ne peut pas stocker les valeurs NULL. La clé primaire identifie de manière unique chaque ligne d’une table.

  • UNIQUE : Garantit que toutes les valeurs d’une colonne sont distinctes. Contrairement à une contrainte PRIMARYKEY, une colonne avec une contrainte UNIQUE peut avoir des valeurs NULL.

  • FOREIGN KEY : Renforce l’intégrité référentielle en exigeant que les valeurs d’une colonne ou d’un ensemble de colonnes correspondent aux valeurs d’une autre table ou de la même table.

  • NOT NULL : Garantit qu’une colonne ne peut pas stocker une valeur NULL.

  • CHECK : Exécute une expression SQL comme condition sur les valeurs qui peuvent être insérées ou mises à jour dans une ou plusieurs colonnes d’une table. Pour plus d’informations, voir Contraintes CHECK.

Une table peut avoir plusieurs clés uniques et des clés étrangères, mais une seule clé primaire. Une contrainte PRIMARY KEY implique que la colonne est à la fois NOT NULL et UNIQUE.

Toutes les clés étrangères doivent faire référence à une clé primaire ou unique correspondant aux types de colonnes de chaque colonne de la clé étrangère. La clé primaire d’une clé étrangère peut se trouver sur une table différente ou sur la même table que la clé étrangère. Lorsque vous définissez des contraintes de FOREIGN KEY sur des tables hybrides, les tables doivent être dans la même base de données.

La table suivante résume les différences de comportement entre les tables standard et les tables hybrides, en ce qui concerne l’application des contraintes et si des contraintes sont requises :

  • Une contrainte est appliquée lorsqu’elle protège une colonne contre toute mise à jour de certaines manières. Par exemple, une colonne déclarée NOT NULL ne peut pas contenir une valeur NULL. Une tentative de copie ou d’insertion d’une valeur NULL dans une colonne NOT NULL entraîne toujours une erreur. Pour les tables hybrides, vous ne pouvez pas définir la propriété NOT ENFORCED sur les contraintes PRIMARY KEY, FOREIGN KEY et UNIQUE. La définition de cette propriété entraîne une erreur invalid constraint property.

  • Une contrainte est obligatoire lorsqu’une ou plusieurs colonnes d’une table doivent avoir une telle contrainte, ce qui n’est vrai que pour les contraintes PRIMARY KEY sur les tables hybrides.

Fonctionnalité

Tables hybrides

Tables standards

Contraintes PRIMARY KEY

Obligatoire, appliqué

Facultatif ; non appliqué

Contraintes FOREIGN KEY

Facultatif, appliqué (intégrité référentielle)

Facultatif ; non appliqué

Contraintes UNIQUE

Obligatoire, appliqué

Facultatif ; non appliqué

Contraintes NOT NULL

Obligatoire, appliqué

Obligatoire, appliqué

Contraintes CHECK

Non pris en charge

Obligatoire, appliqué

Contraintes de tables

Snowflake prend en charge les contraintes sur les tables permanentes, transitoires, temporaires et hybrides. Vous pouvez définir des contraintes sur des colonnes de tous les types de données et inclure n’importe quel nombre de colonnes dans une seule contrainte.

Les considérations suivantes concernent les contraintes :

  • Lorsque vous copiez une table à l’aide de CREATE TABLE … LIKE or CREATE TABLE … CLONE, toutes les contraintes existantes sur la table, y compris les clés étrangères, sont copiées dans la nouvelle table. CREATE TABLE … CLONE n’est pas pris en charge pour les tables hybrides.

  • Des commandes et fonctions supplémentaires, telles que DROP, UNDROP et GET_DDL sont prises en charge pour les tables avec des contraintes. Elles sont également prises en charge pour les schémas et les bases de données.

    Pour Snowflake Time Travel, lorsque des versions précédentes d’une table sont copiées, la version actuelle des contraintes de la table est utilisée car Snowflake ne stocke pas les versions précédentes des contraintes dans les métadonnées de la table.

Contraintes pour une colonne et plusieurs colonnes.

Les contraintes peuvent être définies pour une seule colonne ou plusieurs colonnes d’une même table.

Pour les contraintes multicolonnes (les clés primaires composées ou les clés uniques), les colonnes sont ordonnées, et chaque colonne a une séquence de clés correspondante.

Contraintes en ligne et hors ligne

Les contraintes sont définies en ligne ou hors ligne lors de la création ou de la modification d’une table :

  • Les contraintes en ligne sont créées dans le cadre de la définition de colonne et ne peuvent être utilisées que pour les contraintes à colonne unique.

  • Les contraintes hors ligne sont définies à l’aide d’une clause distincte qui spécifie la ou les colonnes sur lesquelles la contrainte est créée. Elles peuvent être utilisées pour créer des contraintes pour une ou plusieurs colonnes, ainsi que pour créer des contraintes pour des colonnes existantes.

Contraintes dans GET_DDL

Les instructions SQL que GET_DDL renvoie incluent les clauses qui définissent les contraintes ; cependant, notez ce qui suit :

  • Les contraintes à une seule colonne, telles que NOT NULL et DEFAULT, sont reconstruites en ligne avec la définition de la colonne.

  • Les contraintes de table, telles que les clés uniques, principales et étrangères, sont toujours reconstruites en tant que contraintes hors ligne, même si elles sont constituées d’une seule colonne.

  • Pour les contraintes sans nom (c’est-à-dire les contraintes avec un nom généré par le système), GET_DDL ne renvoie pas le nom généré par le système.

Contraintes CHECK

Une contrainte CHECK applique une expression SQL comme condition sur les valeurs qui peuvent être insérées ou mises à jour dans une ou plusieurs colonnes d’une table. Par exemple, une contrainte CHECK peut s’assurer que la colonne quantity d’une table ne contient que des valeurs supérieures à zéro ou que la colonne salary d’une table ne contient que des valeurs dans une plage spécifique.

Vous pouvez spécifier une contrainte CHECK via une clause CONSTRAINT dans les commandes SQL suivantes :

Vous pouvez afficher des informations sur les contraintes CHECK existantes en interrogeant les Vue CHECK_CONSTRAINTS.

Les contraintes de vérification sont appliquées durant les opérations DML suivantes :

Si la condition est évaluée sur TRUE ou NULL, l’opération DML se poursuit. Si la condition est évaluée sur FALSE, la contrainte CHECK échoue.

Pour des exemples de contraintes CHECK, voir Exemples de contraintes avec des tables standard.

Notes sur l’utilisation

  • Les contraintes de vérification sont toujours appliquées.

  • Vous pouvez utiliser les commandes ALTER TABLE suivantes et les équivalents Iceberg pour travailler avec les contraintes CHECK :

    • ALTER TABLE … RENAME CONSTRAINT

    • ALTER TABLE … ADD [ CONSTRAINT <constraint_name> ] CHECK ( <expr> ) ENABLE [ VALIDATE | NOVALIDATE ]

      • ENABLE VALIDATE, la valeur par défaut des contraintes CHECK, applique la contrainte pour toutes les lignes existantes et pour toutes les lignes qui sont insérées ou mises à jour après l’exécution de la commande. ENABLEVALIDATE est uniquement pris en charge pour les nouvelles tables, pas pour les tables existantes.

      • ENABLE NOVALIDATE applique la contrainte pour toutes les lignes qui sont insérées ou mises à jour après l’exécution de la commande, mais n’applique pas la contrainte pour les lignes existantes.

    • ALTER TABLE … ALTER CONSTRAINT <constraint_name> ENABLE [ VALIDATE | NOVALIDATE ]

      Si vous modifiez une contrainte CHECK de NOVALIDATE en VALIDATE, la contrainte est appliquée à toutes les lignes existantes avant d’être modifiée en VALIDATE.

    • ALTER TABLE … DROP CONSTRAINT

  • Les commandes ALTER TABLE suivantes et les équivalents Iceberg peuvent fonctionner sur une colonne avec une contrainte CHECK qui y est définie :

    • ALTER TABLE … ALTER COLUMN

      Seules les opérations qui ne modifient pas une contrainte CHECK sont prises en charge.

    • ALTER TABLE … RENAME COLUMN

      Vérifiez que les contraintes qui font référence à la colonne renommée sont implicitement mises à jour pour utiliser le nouveau nom de colonne.

    • ALTER TABLE … DROP COLUMN

      L’opération échoue si la colonne détruite est utilisée par une contrainte CHECK existante qui fait également référence à une autre colonne. Dans ce cas, supprimez la contrainte avant de supprimer la colonne.

  • Si les enregistrements violent une contrainte CHECK lors de l’ingestion, l’ensemble de l’opération par lots échoue la première fois qu’elle rencontre un enregistrement qui n’est pas valide.

Limitations

  • Seules les tables standard et les tables Iceberg gérées par Snowflake prennent en charge les contraintes CHECK. D’autres types de tables telles que les tables hybrides ne prennent pas en charge les contraintes CHECK.

  • L’expression associée à une contrainte CHECK existante ne peut pas être modifiée à l’aide de la commande ALTERTABLE. Pour modifier l’expression, détruisez et recréez la contrainte CHECK.

  • Les contraintes CHECK ne peuvent pas être spécifiées dans les commandes CREATEORALTERTABLE.

  • Les opérations suivantes ne prennent pas en charge les contraintes CHECK :

    • Si vous tentez de COPYINTO une table avec les contraintes CHECK, l’opération échoue.

    • Si vous tentez de créer un canal avec une table cible qui contient des contraintes CHECK, l’opération échoue.

    • Si vous tentez une ingestion de flux dans une table qui contient des contraintes CHECK, l’opération échoue.

    • Si vous tentez des écritures externes sur des tables Iceberg qui ont des contraintes CHECK, l’opération échoue.