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。

唯一约束可用于 Databricks SQL 以及 Databricks Runtime 18.2 及更高版本中的 Unity Catalog 和 Delta Lake 表,目前处于公开预览阶段。 表可以具有多个唯一约束。 外键可以使用 REFERENCES parent_table(unique_col) 引用另一个表中的唯一列。 唯一约束中的列可以为空,即使该约束被外键引用时也是如此。 NULL 唯一列中的值被视为彼此不同的值,因此重复 NULL 值不会违反唯一约束的语义。

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

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

添加到新表

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

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);
CREATE TABLE U(id INTEGER NOT NULL, email STRING NOT NULL,
                CONSTRAINT u_uq_email UNIQUE(email));

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;
ALTER TABLE U ADD CONSTRAINT u_uq_email UNIQUE(email);