CONSTRAINT 子句

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

添加信息性主键或信息性外键作为 CREATE TABLECREATE MATERIALIZED VIEW 语句的一部分。

若要向 Delta Lake 表添加 CHECK 约束,请在创建表后使用 ALTER TABLE

语法

使用 table_constraint 子句定义跨多个列的约束或将语法与列定义分开。

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

使用 column_constraint 子句定义特定于单个列定义的约束。

column_constraint
  { [ CONSTRAINT name ]
    { PRIMARY KEY [ constraint_option ] [...] |
      { [ FOREIGN KEY ]
        REFERENCES parent_table [ ( parent_column [, ...] ) ]
        [ foreign_key_option | constraint_option ] [...]
      }
    }
  }
constraint_option
    { NOT ENFORCED |
      DEFERRABLE |
      INITIALLY DEFERRED |
      { RELY | NORELY } }

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

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

参数

  • CONSTRAINTname

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

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

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

    向表或具体化视图添加信息性主键约束。 表或具体化视图最多可以有一个主键。

    主键列隐式定义为 NOT NULL

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

    • key_column

      主题表或具体化视图的列。 列名不得重复。

    • TIMESERIES

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

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

  • PRIMARY KEY [ constraint_option ] [...]

    使用前面的键列定义将单个列主键约束添加到表或具体化视图。

    column_constraint 等同于 table_constraint

    PRIMARY KEY (key_column) [ constraint_option ] [...]

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

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

    向表或具体化视图添加信息性外键(引用完整性)约束。

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

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

    • foreign_key_column

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

    • parent_table

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

    • parent_column

      父表或具体化视图中的列,该列是其主键的一部分。 必须列出父表或具体化视图的所有主键列。

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

    • FOREIGN KEY REFERENCES parent_table [ ( parent_column ) ] foreign_key_option

      使用前面的外键列定义将单个列外键约束添加到表或具体化视图。

      column_constraint 等同于 table_constraint

      FOREIGN KEY ( foreign_key_column ) REFERENCES parent_table [ ( parent_column ) ] foreign_key_option

  • 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 不会强制实施主键或外键约束。 请在添加主键或外键之前确认键约束。 引入过程可提供此类保证,你也可以针对数据运行检查。

示例

-- Create a table with a primary key
> CREATE TABLE persons(first_name STRING NOT NULL, last_name STRING NOT NULL, nickname STRING,
                       CONSTRAINT persons_pk PRIMARY KEY(first_name, last_name));

-- create a table with a foreign key
> CREATE TABLE pets(name STRING, owner_first_name STRING, owner_last_name STRING,
                    CONSTRAINT pets_persons_fk FOREIGN KEY (owner_first_name, owner_last_name) REFERENCES persons);

-- Create a table with a single column primary key and system generated name
> CREATE TABLE customers(customerid STRING NOT NULL PRIMARY KEY, name STRING);

-- Create a table with a names single column primary key and a named single column foreign key
> CREATE TABLE orders(orderid BIGINT NOT NULL CONSTRAINT orders_pk PRIMARY KEY,
                      customerid STRING CONSTRAINT orders_customers_fk REFERENCES customers);