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