Contraintes sur Azure Databricks

Azure Databricks prend en charge les clauses de gestion des contraintes SQL standard :

  • Les contraintes appliquées vérifient l’intégrité des données avant d’ajouter des lignes à une table.
  • Les contraintes d’information (clé primaire, clé étrangère et contraintes uniques) définissent les relations entre les champs des tables et ne sont pas appliquées.

Toutes les contraintes sur Azure Databricks nécessitent Delta Lake.

Pour un concept connexe concernant les pipelines Lakeflow, consultez Gérer la qualité des données avec les attentes de pipeline.

Contraintes appliquées

En cas de violation d’une contrainte, la transaction échoue avec une erreur. Azure Databricks prend en charge deux types de contraintes :

  • NOT NULL : indique que les valeurs de colonnes spécifiques ne peuvent pas être Null.
  • CHECK : indique qu’une expression booléenne spécifiée doit avoir la valeur true pour chaque ligne d’entrée.

Remarque

L’ajout d’une contrainte met à niveau le protocole d’écriture de la table si la version d’écriture actuelle est inférieure à 3. Cela peut affecter la compatibilité avec les clients Delta Lake externes. Consultez les protocoles et la compatibilité des fonctionnalités Delta Lake.

Contrainte NOT NULL

Lorsque vous créez une table, spécifiez NOT NULL des contraintes dans le schéma. Pour supprimer ou ajouter NOT NULL des contraintes après la création, utilisez la ALTER TABLE ... ALTER COLUMN commande. L’exemple suivant crée un people_demo tableau que le reste de cette section réutilise :

CREATE OR REPLACE TABLE main.default.people_demo (
  id INT NOT NULL,
  firstName STRING,
  middleName STRING NOT NULL,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
);

ALTER TABLE main.default.people_demo ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE main.default.people_demo ALTER COLUMN ssn SET NOT NULL;

Azure Databricks vérifie que toutes les lignes existantes répondent à la contrainte avant d’ajouter une contrainte NOT NULL à une table.

Si vous spécifiez une contrainte NOT NULL sur une colonne imbriquée dans un struct, le struct parent doit également ne pas avoir la valeur Null. Les colonnes imbriquées dans des types de tableau ou de mappage n’acceptent pas de NOT NULL contraintes.

Voir CREATE TABLE [USING] et ALTER TABLE ALTER COLUMN.

Contrainte CHECK

Gérez les contraintes CHECK avec les commandes ALTER TABLE ADD CONSTRAINT et ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT vérifie que toutes les lignes existantes répondent à la contrainte avant d’ajouter la contrainte à la table.

Les restrictions suivantes s’appliquent aux contraintes de vérification :

  • Une CHECK expression de contrainte peut utiliser toutes les fonctions SQL dans Spark qui retournent toujours le même résultat lorsqu’elles reçoivent les mêmes valeurs d’argument, à l’exception des types de fonctions suivants :
    • Fonctions définies par l’utilisateur.
    • Fonctions d’agrégation.
    • Fonctions de fenêtre.
    • Les fonctions retournent plusieurs lignes.

Ajouter à une table existante

L’exemple suivant ajoute une CHECK contrainte à la people_demo table créée dans la section précédente, puis la supprime :

ALTER TABLE main.default.people_demo ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE main.default.people_demo DROP CONSTRAINT dateWithinRange;

Voir ALTER TABLE ADD CONSTRAINT et ALTER TABLE DROP CONSTRAINT.

Afficher les propriétés de la table de contraintes de vérification

Utilisez les commandes DESCRIBE DETAIL et SHOW TBLPROPERTIES pour afficher les contraintes de la table CHECK. L’exemple suivant ajoute une contrainte à people_demo, puis l’affiche :

ALTER TABLE main.default.people_demo ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL main.default.people_demo;

SHOW TBLPROPERTIES main.default.people_demo;

Supprimer les contraintes de vérification

Dans Databricks Runtime 15.4 LTS et versions ultérieures, utilisez la DROP FEATURE commande pour supprimer les contraintes de vérification d’une table et rétrograder le protocole de table.

Consultez Supprimer une fonctionnalité de table Delta Lake et passer à une version antérieure du protocole de table.

Déclarer la clé primaire, la clé étrangère et les contraintes uniques

La clé primaire, la clé étrangère et les contraintes uniques sont uniquement informationnelles et ne sont pas appliquées. Ils peuvent améliorer les performances par le biais d’optimisations des requêtes.

  • Clé primaire et clé étrangère : disponible pour les tables Unity Catalog et Delta Lake dans Databricks Runtime 13.3 LTS et versions ultérieures. Disponibilité générale dans Databricks Runtime 15.2 et les versions ultérieures. Les clés étrangères doivent référencer une clé primaire ou une contrainte unique dans une autre table.
  • Unique : disponible en préversion publique pour les tables Unity Catalog et Delta Lake dans Databricks SQL et Databricks Runtime 18.2 et versions ultérieures. Une table peut comprendre plusieurs contraintes uniques. Les clés étrangères peuvent faire référence à une colonne unique à l’aide de REFERENCES parent_table(unique_col). Les colonnes uniques peuvent être nullables, car NULL les valeurs sont traitées comme distinctes les unes des autres.

Interrogez le information_schema, utilisez DESCRIBE TABLE EXTENDED ou utilisez SHOW CREATE TABLE pour obtenir des détails sur la façon dont les contraintes sont appliquées à l’échelle d’un catalogue donné.

Ajouter à de nouvelles tables

Déclarez les clés primaires, les clés étrangères et les contraintes uniques dans le cadre de la clause de spécification de table lors de la création de la table :

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
                CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL PRIMARY KEY,
                fk1 INTEGER, fk2 INTEGER,
                CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL,
                CONSTRAINT u_uq_email UNIQUE(email));

Les instructions CTAS ne prennent pas en charge cette clause de contrainte.

Ajouter à des tables existantes

Sinon, ajoutez les mêmes contraintes aux tables qui existent déjà. Cette approche aboutit au même résultat que la section précédente. L’exemple suivant recrée T, , et U sans contraintes, puis ajoute chaque contrainte avec ALTER TABLE ADD CONSTRAINTS. Ajoutez une clé primaire avant la clé étrangère qui la référence :

CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL);
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL, fk1 INTEGER, fk2 INTEGER);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL);

ALTER TABLE main.default.T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE main.default.S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T;
ALTER TABLE main.default.U ADD CONSTRAINT u_uq_email UNIQUE(email);

Ressources supplémentaires