约束属性¶
约束属性在 CREATE TABLE 或 ALTER TABLE 命令的 CONSTRAINT 子句中指定。
本主题内容:
ANSI SQL 约束属性¶
所有约束的属性¶
ANSI SQL 标准中的以下约束属性适用于所有约束(唯一、主键和外键):
{ ENFORCED | NOT ENFORCED }
指定是否在事务中强制执行约束。请注意,
NOT NULL
是 Snowflake 唯一 强制执行的约束。请参阅 参照完整性约束。{ DEFERRABLE | NOT DEFERRABLE }
指定在后续事务中是否可将约束检查推迟到事务结束。
INITIALLY { DEFERRED | IMMEDIATE }
对于 DEFERRABLE 约束,指定是否从下一个事务开始推迟对于约束的检查。
标准约束属性的默认值为:
NOT ENFORCED
DEFERRABLE
INITIALLY DEFERRED
仅适用于外键约束的属性¶
以下约束属性也来自 ANSI SQL 标准,但仅适用于外键:
MATCH { FULL | PARTIAL | SIMPLE }
指定外键是否满足一个或多个列中的 NULL 值。
UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION }
指定更新外键的主键/唯一键时执行的操作。
DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION }
指定删除外键的主键/唯一键时执行的操作。
外键约束属性的默认值为:
MATCH FULL
UPDATE NO ACTION
DELETE NO ACTION
扩展的约束属性¶
以下属性未包含在 ANSI SQL 标准中,但为兼容其他数据库,支持这些属性。它们适用于所有约束(唯一键、主键和外键):
{ ENABLE | DISABLE }
指定启用还是禁用约束。提供这些属性的目的是兼容 Oracle。
默认情况下,此约束属性设置为
DISABLE
。{ VALIDATE | NOVALIDATE }
指定在创建约束时是否验证表中现有数据。仅与
{ ENABLE | DISABLE}
属性配合使用。默认情况下,此约束属性设置为
NOVALIDATE
。{ RELY | NORELY }
指定在查询重写期间是否考虑模式中的
NOVALIDATE
约束。默认情况下,此约束属性设置为
NORELY
。如果已确保表中的数据符合约束条件,则可以将其更改为
RELY
,表示查询优化器应预计表中的数据遵守约束条件。设置RELY
属性可以提高查询性能(例如,通过 消除不必要的联接)。对于主键约束和外键约束,请在主键约束和外键约束上设置此属性。例如:
ALTER TABLE table_with_primary_key ALTER CONSTRAINT a_primary_key_constraint RELY; ALTER TABLE table_with_foreign_key ALTER CONSTRAINT a_foreign_key_constraint RELY;
ENABLE
和 VALIDATE
约束属性的非默认值¶
为了保证与其他数据库的语法兼容性,Snowflake 支持为约束属性指定非默认值。
但如果在创建新约束时指定了 ENABLE
或 VALIDATE
(这些属性的非默认值),则 不会创建约束。这不适用于 RELY
。指定 RELY
会导致创建新约束。
请注意,Snowflake 提供了一个会话参数 UNSUPPORTED_DDL_ACTION,用于指定在约束创建期间指定非默认值是否会生成错误。