约束
Delta 表支持标准 SQL 约束管理子句,以确保自动验证添加到表中的数据的质量和完整性。 当违反约束时,Delta Lake 将引发 InvariantViolationException
以指示无法添加新数据。
重要
添加约束会自动升级表写入器协议版本。 请参阅表协议版本控制以了解表协议版本控制以及升级协议版本的含义。
支持两种类型的约束:
NOT NULL
:指示特定列中的值不能为 null。CHECK
:指示每个输入行的指定的布尔表达式必须为 true。
NOT NULL
约束
注意
DROP NOT NULL
适用于 Databricks Runtime 7.0 和更高版本。SET NOT NULL
适用于 Databricks Runtime 7.4 及更高版本。- 在向表添加
NOT NULL
约束之前,Azure Databricks 会验证所有现有行是否都满足约束。
在创建表时,在架构中指定 NOT NULL
约束,并使用 ALTER TABLE CHANGE COLUMN
命令删除 NOT NULL
约束。
> CREATE TABLE default.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 default.people10m CHANGE COLUMN middleName DROP NOT NULL;
可以使用 ALTER TABLE CHANGE COLUMN SET NOT NULL
命令向现有 Delta 表添加 NOT NULL
约束。
CREATE TABLE events(
id LONG,
date STRING,
location STRING,
description STRING
) USING DELTA;
ALTER TABLE events CHANGE COLUMN id SET NOT NULL;
如果在结构中嵌套的列上指定了 NOT NULL
约束,则父结构也被约束为不为 NULL。 然而,在数组或映射类型中嵌套的列不接受 NOT NULL
约束。
有关参考信息,请参阅 CREATE TABLE USING 和 ALTER TABLE ALTER COLUMN。
CHECK
约束
注意
- 适用于 Databricks Runtime 7.4 及更高版本。
- 在 Databricks Runtime 7.3 LTS 中,你可以写入已定义
CHECK
约束的表,但不能创建CHECK
约束。
使用 ALTER TABLE ADD CONSTRAINT
和 ALTER TABLE DROP CONSTRAINT
命令管理 CHECK
约束。 在将约束添加到表中之前,ALTER TABLE ADD CONSTRAINT
会验证所有现有行是否满足约束。
> CREATE TABLE default.people10m (
id INT,
firstName STRING,
middleName STRING,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
ssn STRING,
salary INT
) USING DELTA;
> ALTER TABLE default.people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
> ALTER TABLE default.people10m DROP CONSTRAINT dateWithinRange;
有关参考信息,请参阅 ALTER TABLE ADD CONSTRAINT 和 ALTER TABLE DROP CONSTRAINT。
CHECK
约束是 DESCRIBE DETAIL
和 SHOW TBLPROPERTIES
命令的输出中的表属性。
> ALTER TABLE default.people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);
> DESCRIBE DETAIL default.people10m;
> SHOW TBLPROPERTIES default.people10m;