约束条件

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 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;