Azure Databricks 上的所有约束都需要 Delta Lake。

Delta Live Tables 有一个类似的概念,称为预期。 请参阅 使用 Delta Live Tables 管理数据质量

在 Azure Databricks 上强制实施约束

当违反约束时,事务将失败并出现错误。 支持两种类型的约束:

  • NOT NULL :指示特定列中的值不能为 null。
  • CHECK :指示每个输入行的指定的布尔表达式必须为 true。
  • 如果之前的编写器版本小于 3,则添加约束会自动升级表写入器协议版本。 请参阅 Azure Databricks 如何管理 Delta Lake 功能兼容性? ,了解表协议版本控制以及升级协议版本意味着什么。

    在 Azure Databricks 中设置 NOT NULL 约束

  • SET NOT NULL 适用于 Databricks Runtime 7.4 和更高版本。
  • 在创建表时,在架构中指定 NOT NULL 约束。 使用 ALTER TABLE ALTER COLUMN 命令删除或添加 NOT NULL 约束。

    CREATE TABLE people10m (
      id INT NOT NULL,
      firstName STRING,
      middleName STRING NOT NULL,
      lastName STRING,
      gender STRING,
      birthDate TIMESTAMP,
      ssn STRING,
      salary INT
    ) USING DELTA;
    ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
    ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;
    

    在向表添加 NOT NULL 约束之前,Azure Databricks 会验证所有现有行是否都满足约束。

    如果在结构中嵌套的列上指定了 NOT NULL 约束,则父结构也必须不为 null。 在数组或映射类型中嵌套的列不接受 NOT NULL 约束。

    请参阅 CREATE TABLE [USING]ALTER TABLE ALTER COLUMN

    在 Azure Databricks 中设置 CHECK 约束

  • 适用于 Databricks Runtime 7.4 及更高版本。
  • 在 Databricks Runtime 7.3 LTS 中,你可以写入已定义 CHECK 约束的表,但不能创建 CHECK 约束。
  • 使用 ALTER TABLE ADD CONSTRAINTALTER TABLE DROP CONSTRAINT 命令管理 CHECK 约束。 在将约束添加到表中之前,ALTER TABLE ADD CONSTRAINT 会验证所有现有行是否满足约束。

    CREATE TABLE people10m (
      id INT,
      firstName STRING,
      middleName STRING,
      lastName STRING,
      gender STRING,
      birthDate TIMESTAMP,
      ssn STRING,
      salary INT
    ) USING DELTA;
    ALTER TABLE people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
    ALTER TABLE people10m DROP CONSTRAINT dateWithinRange;
    

    请参阅 ALTER TABLE ADD CONSTRAINTALTER TABLE DROP CONSTRAINT

    CHECK 约束在 DESCRIBE DETAILSHOW TBLPROPERTIES 命令的输出中以表属性的形式公开。

    ALTER TABLE people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);
    DESCRIBE DETAIL people10m;
    SHOW TBLPROPERTIES people10m;
    

    声明主键和外键关系

    此功能目前以公共预览版提供。

  • 主键和外键约束在 Databricks Runtime 11.1 及更高版本中可用。
  • 主键和外键约束需要 Unity Catalog 和 Delta Lake。
  • 可以在 Unity Catalog 表中的字段上使用主键和外键关系。 主键和外键仅供参考,不会被强制执行。 外键必须引用另一个表中的主键。

    在表创建过程中,可以将主键和外键声明为表规范子句的一部分。 在 CTAS 语句期间,不允许使用此子句。 还可以向现有表添加约束。

    CREATE TABLE T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
                    CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
    CREATE TABLE S(pk INTEGER NOT NULL PRIMARY KEY,
                    fk1 INTEGER, fk2 INTEGER,
                    CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T);
    

    可以查询 information_schema 或使用 DESCRIBE 来获取有关如何在给定目录中应用约束的详细信息。

  • ALTER TABLE
  • ADD CONSTRAINT
  • DROP CONSTRAINT
  • CONSTRAINT 子句
  •