ADD CONSTRAINT 子句

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

向现有 Delta Lake 表添加信息性主键、信息性外键或强制 CHECK 约束。

语法

ADD [check_constraint | key_constraint ]

check_constraint
    CONSTRAINT name CHECK ( condition ) [ ENFORCED ]

key_constraint
    { [ CONSTRAINT name ]
      {
        PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ] |
        { FOREIGN KEY (foreign_key_column [, ...] )
          REFERENCES parent_table [ ( 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

    为 Delta Lake 表定义 CHECK 约束。

    • CONSTRAINTname

      指定约束的名称。 名称在表中必须唯一。 如果未提供任何名称,Azure Databricks 会生成一个。

    • CHECK (condition)

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

      condition 可能包含文本、表中的列标识符以及内置的确定性 SQL 函数或运算符,但以下内容除外:

      此外,condition 不能包含任何condition

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

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

  • key_constraint

    重要

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

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

    为 Delta Lake 表定义信息性主键或信息性外键约束。

    • CONSTRAINTname

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

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

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

      向 Delta Lake 表添加主键约束。 一个表最多只能有一个主键。

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

    • key_column

      主题表中定义为 NOT NULL 的列。 列名不得重复。

    • TIMESERIES

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

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

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

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

      向 Delta Lake 表添加外键(引用完整性)约束。

      hive_metastore 目录中的表不支持外键约束。

      • foreign_key_column

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

      • parent_table

        指定外键引用的表。 该表必须具有定义的 PRIMARY KEY 约束,并且你必须对该表拥有 SELECT 特权。

      • parent_column

        父表中的列,属于其主键的一部分。 父表的所有主键列都必须列出。

        如果未列出父列,则默示为按 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 约束)

        如果 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);