约束
Delta 表支持标准 SQL 约束管理子句,这些子句可确保自动验证添加到表中的数据质量和完整性。当约束被违反时,Delta Lake 会抛出 InvariantViolationException
,表示新数据无法添加。
支持两种类型的约束
NOT NULL
:表示特定列中的值不能为 null。CHECK
:表示对于每个输入行,指定的布尔表达式必须为 true。
NOT NULL
约束
标题为“NOT NULL 约束”的部分您在创建表时在 schema 中指定 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;
如果您在 struct 中嵌套的列上指定 NOT NULL
约束,则父 struct 也被约束为不能为 null。但是,嵌套在数组或映射类型中的列不接受 NOT NULL
约束。
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;
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;