约束条件
Delta表支持标准SQL约束管理子句,确保自动验证添加到表中的数据质量和完整性。当违反约束时,Delta Lake会抛出InvariantViolationException异常,表示无法添加新数据。
重要
添加约束会自动升级表的写入协议版本。请参阅Delta Lake如何管理功能兼容性?以了解表协议版本控制以及升级协议版本的含义。
支持两种类型的约束:
NOT NULL: 表示特定列中的值不能为空。CHECK: 表示每条输入行都必须满足指定的布尔表达式为真。
NOT NULL 约束
在创建表时,您可以在模式中指定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;
如果在结构体内部嵌套的列上指定NOT NULL约束,则父结构体也会被约束为非空。但是,数组或映射类型内部嵌套的列不接受NOT NULL约束。
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;
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;