ADD CONSTRAINT 子句

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime

向现有 Delta Lake 表添加 信息主 键、 信息 外键、 信息 唯一约束或强制检查约束。

语法

ADD [check_constraint | key_constraint ]

check_constraint
    CONSTRAINT name CHECK ( condition )

key_constraint
    { [ CONSTRAINT name ]
      {
        PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ] |
        UNIQUE ( key_column [, ...] ) [ constraint_option [...] ] |
        { FOREIGN KEY (foreign_key_column [, ...] )
          REFERENCES parent_relation [ ( parent_column [, ...] ] )
          [ constraint_option | foreign_key_option ] [...]
      }
    }

constraint_option
    { NOT ENFORCED |
      DEFERRABLE |
      INITIALLY DEFERRED |
      { NORELY | RELY } }

foreign_key_option
    { MATCH FULL |
      ON UPDATE NO ACTION |
      ON DELETE NO ACTION }

为了与非标准 SQL 方言兼容,可以指定 ENABLE NOVALIDATE 而不是 NOT ENFORCED DEFERRABLE INITIALLY DEFERRED

参数

  • check_constraint

    定义关系的检查约束。

    • CONSTRAINT 名字

      指定约束的名称。 该名称在关系中必须是唯一的。

    • CHECK ( 条件)

      关系的DEFAULT COLLATION必须在添加约束时是UTF8_BINARY

      condition 必须是返回 BOOLEAN 的确定性表达式。

      condition 可以由文本、关系中的列标识符和确定性的内置 SQL 函数或运算符组成,但以下情况除外:

      此外,condition 不能包含任何condition

      若要在 Azure Databricks 中满足 CHECK 约束,它的计算结果必须为 true

      Delta Lake 验证针对新数据和现有数据的 CHECK 约束的有效性。 如果任何现有行违反约束,将引发错误。

  • key_constraint

    重要

    此功能目前以公共预览版提供。

    适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime 11.3 LTS 及更高版本

    定义 关系的信息性 主键、 信息 外键或 信息性 唯一约束。 不会强制实施信息关键约束,但可以通过支持 查询优化来提高性能。

    • CONSTRAINT 名字

      (可选)指定约束的名称。 该名称在架构中必须唯一。 如果未提供任何名称,Azure Databricks 会生成一个。

    • PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ]

      适用于:勾选“是” 仅 Unity Catalog

      向关系添加主键约束。 关系最多可以有一个主键。

      目录中的关系 hive_metastore 不支持主键约束。

    • key_column

      定义为主题关系的 NOT NULL列。 列名不得重复。

    • TIMESERIES

      适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime 13.3 LTS 及更高版本

      (可选)将主键列组件标记为表示时序。

    • UNIQUE ( key_column [, ...] ) [ constraint_option [...] ]

      适用于:检查标记为“是”的 Databricks SQL 检查标记为“是”是 Databricks Runtime 18.2 及更高 版本检查标记为“是 ”,仅限 Unity 目录

      向关系添加唯一约束。 关系可以有多个唯一约束。

      约束中的 UNIQUE 列可以为 null。 NULL UNIQUE列中的值被视为彼此不同的值,因此重复NULL值不会违反约束的UNIQUE语义。

      目录中的关系 hive_metastore 不支持唯一约束。

      • key_column

        主题关系中的一列。 列名不得重复。

    • FOREIGN KEY ( foreign_key_column [, ...] ) REFERENCES parent_relation [ ( parent_column [, ...] ) ] foreign_key_option

      适用于:勾选“是” 仅 Unity Catalog

      将外键(引用完整性)约束添加到关系中。

      hive_metastore目录中,关系不支持外键约束。

      • foreign_key_column

        主题关系中的一列。 列名不得重复。 每列的数据类型必须与匹配的 parent_column 的类型相匹配。 列数必须与 parent_columns 的数量相匹配。 两个外键不能共享一组相同的外键列。

      • parent_relation

        指定外键引用的关系。 关系必须具有定义的 PRIMARY KEY 约束,或者,在 Databricks Runtime 18.2 及更高版本中,必须具有定义的 UNIQUE 约束,并且必须具有 SELECT 该关系的权限。

      • parent_column

        父关系中的列,它是其主键的一部分,或者,在 Databricks Runtime 18.2 及更高版本中,是唯一约束的一部分。 必须列出父关系的所有主键列或唯一约束列。

        如果未列出父列,则默示为按 PRIMARY KEY 定义中给出的顺序指定它们。

      不允许使用仅在外键列的排列上有所不同的外键约束。

    • constraint_option

      列出约束的属性。 所有属性都是可选的,但默认为默示属性。 每个属性最多只能指定一次。

      • NOT ENFORCED

        Azure Databricks 不对现有行或新行强制执行此操作。

      • DEFERRABLE

        可延迟强制执行约束。

      • INITIALLY DEFERRED

        延迟强制执行约束。

      • NORELYRELY

        适用于勾选“是” Databricks SQL 勾选“是” Databricks Runtime 14.2 及更高版本(适用于 PRIMARY KEY 约束)

        适用于勾选标记为“是” Databricks SQL 勾选标记为“是” Databricks Runtime 15.4 及更高版本(适用于 FOREIGN KEY 约束)

        适用于:检查标记为是 Databricks SQL 检查标记为是 Databricks Runtime 18.2 及更高版本的约束UNIQUE

        如果 RELY,则 Azure Databricks 可能会利用约束来重写查询。 用户负责确保满足约束。 依赖于未被满足的约束可能会导致查询结果不正确。

        默认为 NORELY

    • foreign_key_option

      列出特定于外键约束的属性。 所有属性都是可选的,但默认为默示属性。 每个属性最多只能指定一次。

      • MATCH FULL

        要使约束被视为 true,所有列值都必须为 NOT NULL

      • ON UPDATE NO ACTION

        如果父级 PRIMARY KEY 已更新,Azure Databricks 不会执行任何操作来限制更新或更新外键。

      • ON DELETE NO ACTION

        如果父行已删除,Azure Databricks 不会执行任何操作来限制操作、更新外键或删除从属行。

重要

Azure Databricks不强制实施主键、外键或唯一约束。 在添加主键、外键或唯一约束之前,请确认键约束。 引入过程可提供此类保证,你也可以针对数据运行检查。

示例

-- Add a primary key
> CREATE TABLE persons(first_name STRING NOT NULL, last_name STRING NOT NULL, nickname STRING);
> ALTER TABLE persons ADD CONSTRAINT persons_pk PRIMARY KEY(first_name, last_name);

-- Add a foreign key which Databricks does not enforce, but can rely upon.
> CREATE TABLE pets(name STRING, owner_first_name STRING, owner_last_name STRING);
> ALTER TABLE pets ADD CONSTRAINT pets_persons_fk
    FOREIGN KEY(owner_first_name, owner_last_name) REFERENCES persons
    NOT ENFORCED RELY;

-- Add a check contraint
> ALTER TABLE pets ADD CONSTRAINT pets_name_not_cute_chk CHECK (length(name) < 20);

-- Add a unique constraint
> CREATE TABLE person_emails(first_name STRING NOT NULL, last_name STRING NOT NULL, email STRING);
> ALTER TABLE person_emails ADD CONSTRAINT person_emails_uq UNIQUE(email);