约束

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 USINGALTER TABLE ALTER COLUMN

CHECK 约束

注意

  • 适用于 Databricks Runtime 7.4 及更高版本。
  • 在 Databricks Runtime 7.3 LTS 中,你可以写入已定义 CHECK 约束的表,但不能创建 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;

有关参考信息,请参阅 ALTER TABLE ADD CONSTRAINTALTER TABLE DROP CONSTRAINT

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;