Aperçu des contraintes

Snowflake offre la fonctionnalité de contrainte suivante :

  • Clés uniques, primaires et étrangères et colonnes NOT NULL.

  • 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.

Dans ce chapitre :

Types de contraintes pris en charge

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

  • PRIMARY KEY

  • FOREIGN KEY

  • UNIQUE

  • NOT NULL

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 clé étrangère 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 « propriété de contrainte non valide ».

  • 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é

Voir aussi CREATE | ALTER TABLE … CONSTRAINT.

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.

  • 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 ou 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 renvoient 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/é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.