适用于:
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 [...] ] |
{ 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不支持主键约束。-
定义为主题关系的
NOT NULL列。 列名不得重复。 TIMESERIES适用于:
Databricks SQL
Databricks Runtime 13.3 LTS 及更高版本(可选)将主键列组件标记为表示时序。
FOREIGN KEY ( foreign_key_column [, ...] ) REFERENCES parent_relation [ ( parent_column [, ...] ) ] foreign_key_option适用于:
仅 Unity Catalog将外键(引用完整性)约束添加到关系中。
在
hive_metastore目录中,关系不支持外键约束。-
主题关系中的一列。 列名不得重复。 每列的数据类型必须与匹配的
parent_column的类型相匹配。 列数必须与parent_columns的数量相匹配。 两个外键不能共享一组相同的外键列。 -
指定外键引用的关系。 关系必须具有定义的
PRIMARY KEY约束,并且必须具有SELECT该关系的权限。 -
父关系中的列,该列是其主键的一部分。 必须列出父关系的所有主键列。
如果未列出父列,则默示为按
PRIMARY KEY定义中给出的顺序指定它们。
不允许使用仅在外键列的排列上有所不同的外键约束。
-
constraint_option列出约束的属性。 所有属性都是可选的,但默认为默示属性。 每个属性最多只能指定一次。
NOT ENFORCEDAzure 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);