CONSTRAINT 子句
适用于: Databricks SQL Databricks Runtime
添加信息性主键或信息性外键作为 CREATE TABLE 或 CREATE 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
。
参数
CONSTRAINT
name(可选)指定约束的名称。 该名称在架构中必须唯一。 如果未提供任何名称,Azure Databricks 会生成一个。
PRIMARY KEY
( key_column [ TIMESERIES ] [, …] ) [ constraint_option […] ]适用于: Databricks SQL Databricks Runtime 11.3 LTS 及更高版本 仅 Unity 目录
向表或具体化视图添加信息性主键约束。 表或具体化视图最多可以有一个主键。
主键列隐式定义为
NOT NULL
。hive_metastore
目录中的表不支持主键约束。-
主题表或具体化视图的列。 列名不得重复。
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
目录中的表不支持外键约束。不允许使用仅在外键列的排列上有所不同的外键约束。
-
主题表或具体化视图的列。 列名不得重复。 每列的数据类型必须与匹配的
parent_column
的类型相匹配。 列数必须与parent_column
的数量相匹配。 两个外键不能共享一组相同的外键列。 -
指定外键引用的表或具体化视图。 该表必须具有定义的
PRIMARY KEY
约束,并且你必须对该表拥有SELECT
特权。 -
父表或具体化视图中的列,该列是其主键的一部分。 必须列出父表或具体化视图的所有主键列。
如果未列出父列,则按
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
延迟强制执行约束。
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 不会强制实施主键或外键约束。 请在添加主键或外键之前确认键约束。 引入过程可提供此类保证,你也可以针对数据运行检查。
示例
-- 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);