跳到内容

约束

Delta 表支持标准 SQL 约束管理子句,这些子句可确保自动验证添加到表中的数据质量和完整性。当约束被违反时,Delta Lake 会抛出 InvariantViolationException,表示新数据无法添加。

支持两种类型的约束

  • NOT NULL:表示特定列中的值不能为 null。
  • CHECK:表示对于每个输入行,指定的布尔表达式必须为 true。

您在创建表时在 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 约束。

您可以使用 ALTER TABLE ADD CONSTRAINTALTER 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 DETAILSHOW TBLPROPERTIES 命令输出中的表属性。

ALTER TABLE default.people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);
DESCRIBE DETAIL default.people10m;
SHOW TBLPROPERTIES default.people10m;