Azure Databricks 的约束

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

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

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

有关 Lakeflow 管道中的相关概念,请参阅 使用管道期望管理数据质量

强制约束

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

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

Note

如果当前编写器版本小于 3,则添加约束会升级表编写器协议。 这可能会影响与外部 Delta Lake 客户端的兼容性。 请参阅 Delta Lake 功能兼容性和协议

NOT NULL 约束

创建表时,请在架构中指定 NOT NULL 约束。 创建后要删除或添加 NOT NULL 约束,请使用以下 ALTER TABLE ... ALTER COLUMN 命令。 以下示例创建了一个 people_demo 表,本节其余部分将重复使用:

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在向表添加 NOT NULL 约束之前验证所有现有行是否满足约束。

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

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

CHECK 约束

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

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

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

添加到现有表

以下示例在上一节创建的表格中添加了一个 CHECK 约束 people_demo ,然后将其删除:

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

请参阅 ALTER TABLE ADD CONSTRAINTALTER TABLE DROP CONSTRAINT

查看检查约束表属性

使用DESCRIBE DETAILSHOW TBLPROPERTIES命令查看表CHECK的约束。 以下示例向 people_demo 添加一个约束,然后显示该约束:

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;

删除检查约束

在 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 目录和 Delta Lake 表的公共预览版中提供。 表可以具有多个唯一约束。 外键可以使用 REFERENCES parent_table(unique_col) 引用唯一列。 唯一列可以为 null,因为 NULL 值被视为彼此不同的值。

查询 information_schema,使用 DESCRIBE TABLE EXTENDEDSHOW CREATE 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));

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

添加到现有表

或者,也可以在已有的表中添加相同的约束。 这种方法得出了与前一部分相同的结果。 以下示例在不添加任何约束的情况下重新创建 TSU,然后使用 ALTER TABLE ADD CONSTRAINT 添加每个约束。 在引用它的外键前添加一个主键:

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

其他资源