Azure Databricks 的约束

Azure Databricks 支持标准 SQL 约束管理子句。 约束可分为两类:

  • 强制实施约束可确保自动验证添加到表中的数据的质量和完整性。
  • 信息性主键和外键约束对表中字段之间的关系进行编码,但不强制实施。

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 约束

在创建表时,在架构中指定 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
);

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 约束

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

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;

禁用 CHECK 约束

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

请参阅删除 Delta 表功能

声明主键和外键关系

注意

  • 主键和外键约束在 Databricks Runtime 11.3 LTS 及更高版本中可用,在 Databricks Runtime 15.2 及更高版本中完全正式发布。
  • 主键和外键约束需要 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 来获取有关如何在给定目录中应用约束的详细信息。

请参阅: