约束概述¶
Snowflake 提供以下约束功能:
唯一键、主键、外键和 NOT NULL 列。
命名约束。
单列和多列约束。
创建内联和外联约束。
创建、修改和删除约束。
本主题内容:
支持的约束类型¶
Snowflake 支持 ANSI SQL 标准中的以下约束类型:
PRIMARY KEY
FOREIGN KEY
UNIQUE
NOT NULL
一个表可以有多个唯一键和外键,但只能有一个主键。PRIMARY KEY 约束意味着列既是 NOT NULL 也是 UNIQUE。
所有外键都必须引用与外键中每列的列类型匹配的相应主键或唯一键。外键的相应主键可以与外键位于不同或相同的表上。在跨 混合表 定义外键约束时,这些表必须位于同一数据库中。
下表总结了标准表和混合表之间在约束的执行以及是否需要约束方面的行为差异。
当约束条件保护列不以某些方式更新时,该约束条件被 强制执行。例如,声明为 NOT NULL 的列不能包含 NULL 值。尝试将 NULL 值复制或插入到 NOT NULL 列时,总是导致错误。对于混合表,不能在 PRIMARY KEY、FOREIGN KEY 和 UNIQUE 约束条件上设置 NOT ENFORCED 属性。设置该属性会导致“invalid constraint property”错误。
当表中的一个或多个列必须具有这样的约束条件时,约束条件则是 必需的,仅对混合表的 PRIMARY KEY 约束条件有效。
功能 |
混合表 |
标准表 |
---|---|---|
PRIMARY KEY 约束 |
必需,已强制执行 |
可选,未强制执行 |
FOREIGN KEY 约束 |
可选、已强制执行(参照完整性) |
可选,未强制执行 |
UNIQUE 约束 |
可选,已强制执行 |
可选,未强制执行 |
NOT NULL 约束 |
可选,已强制执行 |
可选,已强制执行 |
表约束条件¶
Snowflake 支持对永久表、瞬态表、临时表和混合表的约束。可以对所有数据类型的列定义约束,并且可以在单个约束中包括任意数量的列。
在使用 CREATE TABLE ... LIKE 或 CREATE TABLE ... CLONE 复制表时,则表上的所有现有约束(包括外键)都将复制到新表中(混合表不支持 CREATE TABLE ... CLONE)。
具有约束的表还支持其他命令和函数,例如 DROP/UNDROP 和 GET_DDL。架构和数据库也支持它们。
对于 Snowflake Time Travel,如果复制表的先前版本,则会使用表的当前版本约束,因为 Snowflake 不会在表元数据中存储以前版本的约束。
单列和多列约束¶
可以对单列或同一表中的多列定义约束。
对于多列约束(复合主键或唯一键),列是有序的,每列都有相应的键序列。
内联和外联约束¶
约束可以在表创建或修改期间以内联或外联方式进行定义:
内联约束作为列定义的一部分创建,只能用于单列约束。
外联约束使用单独的子句定义,该子句指定了创建约束的列。外联约束可用于创建单列或多列约束,还可用于在现有列上创建约束。
GET_DDL 约束¶
GET_DDL 返回的 SQL 语句包括定义约束的子句;但是,请注意以下几点:
单列约束(如
NOT NULL
和DEFAULT
)是根据列的定义重新构造的内联。表约束(如唯一键/主键/外键)始终被重新构造为外联约束,即使它们由单个列组成也是如此。
对于未命名的约束(即具有系统生成名称的约束),GET_DDL 不会返回系统生成的名称。