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
约束
注意
SET NOT NULL
适用于 Databricks Runtime 7.4 和更高版本。
在创建表时,在架构中指定 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
) USING DELTA;
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
) USING DELTA;
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;
声明主键和外键关系
重要
此功能目前以公共预览版提供。
注意
- 主键和外键约束在 Databricks Runtime 11.1 及更高版本中可用。
- 主键和外键约束需要 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
来获取有关如何在给定目录中应用约束的详细信息。
请参阅: