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 约束。
CONSTRAINT
name指定约束的名称。 名称在表中必须唯一。 如果未提供任何名称,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 表定义信息性主键或信息性外键约束。
CONSTRAINT
name(可选)指定约束的名称。 该名称在架构中必须唯一。 如果未提供任何名称,Azure Databricks 会生成一个。
PRIMARY KEY ( key_column [ TIMESERIES ] [, ...] ) [ constraint_option [...] ]
适用于: 仅 Unity Catalog
向 Delta Lake 表添加主键约束。 一个表最多只能有一个主键。
hive_metastore
目录中的表不支持主键约束。-
主题表中定义为
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
目录中的表不支持外键约束。-
主题表的列。 列名不得重复。 每列的数据类型必须与匹配的
parent_column
的类型相匹配。 列数必须与parent_columns
的数量相匹配。 两个外键不能共享一组相同的外键列。 -
指定外键引用的表。 该表必须具有定义的
PRIMARY KEY
约束,并且你必须对该表拥有SELECT
特权。 -
父表中的列,属于其主键的一部分。 父表的所有主键列都必须列出。
如果未列出父列,则默示为按
PRIMARY KEY
定义中给出的顺序指定它们。
不允许使用仅在外键列的排列上有所不同的外键约束。
-
constraint_option
列出约束的属性。 所有属性都是可选的,但默认为默示属性。 每个属性最多只能指定一次。
NOT ENFORCED
Azure Databricks 不对现有行或新行强制执行此操作。
DEFERRABLE
可延迟强制执行约束。
INITIALLY DEFERRED
延迟强制执行约束。
NORELY
或RELY
适用于: 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);