Azure Databricks 的约束

Azure Databricks支持标准 SQL 约束管理子句:

  • 强制约束在向表添加行之前验证数据完整性。
  • 信息性主键和外键约束定义表中字段之间的关系,但不强制实施。

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

有关 Lakeflow Spark 声明式管道中相关概念的信息,请参阅 使用管道期望管理数据质量

对 Azure Databricks 的强制约束

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

  • NOT NULL:指示特定列中的值不能为 null。
  • CHECK:指示每个输入行的指定的布尔表达式必须为 true。

重要

添加约束时,如果以前的编写器版本小于 3,Azure Databricks会自动升级表编写器协议版本。 请参阅 Delta Lake 功能兼容性和协议 ,了解表协议版本控制以及升级协议版本的含义。

在 Azure Databricks 中设置 NOT NULL 约束

创建表时,请在架构中指定 NOT NULL 约束。 若要删除或添加 NOT NULL 约束,请使用 ALTER TABLE ... ALTER COLUMN 以下命令:

CREATE TABLE people10m (
  id INT NOT NULL,
  firstName STRING,
  middleName STRING NOT NULL,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
);

ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;

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

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

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

在 Azure Databricks 中设置 CHECK 约束

使用CHECKALTER TABLE ADD CONSTRAINT命令管理ALTER TABLE DROP CONSTRAINT约束。 ALTER TABLE ADD CONSTRAINT 在将约束添加到表之前,验证所有现有行是否满足约束。

以下限制适用于检查约束:

  • CHECK约束表达式可以使用 Spark 中的任何 SQL 函数,当给定相同的参数值时,始终返回相同的结果,但以下类型的函数除外:
    • 用户定义的函数。
    • 聚合函数。
    • 窗口函数。
    • 返回多行的函数。

添加到现有表

CREATE TABLE people10m (
  id INT,
  firstName STRING,
  middleName STRING,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
);

ALTER TABLE people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE people10m DROP CONSTRAINT dateWithinRange;

请参阅 ALTER TABLE ADD CONSTRAINTALTER TABLE DROP CONSTRAINT

查看检查约束表属性

使用DESCRIBE DETAILSHOW TBLPROPERTIES命令查看表CHECK的约束。

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

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

删除检查约束

在 Databricks Runtime 15.4 LTS 及更高版本中,使用 DROP FEATURE 命令从表中删除检查约束并降级表协议。

请参阅删除 Delta Lake 表功能并降级表协议

声明主键和外键关系

主键和外键约束适用于 Databricks Runtime 13.3 LTS 及更高版本中的 Unity 目录和 Delta Lake 表,在 Databricks Runtime 15.2 及更高版本中为 GA。

主键和外键只是信息性的,不会强制执行。 外键必须引用另一个表中的主键。 信息性关键约束可能会通过 查询优化来提高性能。

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

添加到新表

在创建表期间将主键和外键声明为表规范子句的一部分:

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);

CTAS 语句不支持此约束子句。

添加到现有表

向现有表添加约束:

ALTER TABLE T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T;