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 CONSTRAINT
和 ALTER 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 CONSTRAINT 和 ALTER TABLE DROP CONSTRAINT。
CHECK
约束在 DESCRIBE DETAIL
和 SHOW 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
来获取有关如何在给定目录中应用约束的详细信息。
请参阅: