CREATE | ALTER TABLE ... CONSTRAINT

本主题介绍了如何通过在 CREATE TABLEALTER TABLE 语句中指定 CONSTRAINT 子句来创建约束:

  • 内联约束被指定为单个列定义的一部分。

  • 外联约束被指定为独立的子句:

    • 创建表时,该子句是表的列定义的一部分。

    • 更改表时,该子句被指定为表的显式 ADD 操作。

有关更多信息(包括详细示例),请参阅 约束

语法

内联唯一键/主键/外键

CREATE TABLE <name> ( <col1_name> <col1_type>    [ NOT NULL ] { inlineUniquePK | inlineFK }
                     [ , <col2_name> <col2_type> [ NOT NULL ] { inlineUniquePK | inlineFK } ]
                     [ , ... ] )

ALTER TABLE <name> ADD COLUMN <col_name> <col_type> [ NOT NULL ] { inlineUniquePK | inlineFK }
Copy

其中:

inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy
inlineFK :=
  [ CONSTRAINT <constraint_name> ]
  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy

外联唯一键/主键/外键

CREATE TABLE <name> ... ( <col1_name> <col1_type>
                         [ , <col2_name> <col2_type> , ... ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , ... ] )

ALTER TABLE <name> ... ADD { outoflineUniquePK | outoflineFK }
Copy

其中:

outoflineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy
outoflineFK :=
  [ CONSTRAINT <constraint_name> ]
  FOREIGN KEY ( <col_name> [ , <col_name> , ... ] )
  REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy

约束属性

为了与其他数据库兼容,Snowflake 提供了约束属性。可以为约束指定的属性取决于类型:

  • 某些属性适用于所有键(唯一键、主键和外键)。

  • 其他属性仅适用于外键。

重要

提供这些属性是为了便于从其他数据库迁移。Snowflake 不会 强制执行或维护这些属性。这意味着这些属性的默认值可以更改,但更改默认值会导致 Snowflake 无法 创建约束。

有关更多详细信息,请参阅 约束属性

属性(适用于所有键)

以下约束属性适用于所有键(属性的顺序可互换):

[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
{ ENABLE | DISABLE }
{ VALIDATE | NOVALIDATE }
{ RELY | NORELY }
Copy
  • { VALIDATE | NOVALIDATE } 仅在指定了 { ENFORCED | NOT ENFORCED }{ ENABLE | DISABLE } 时适用。

  • { RELY | NORELY } 仅在指定了 NOVALIDATE 时适用。

  • 默认:

    NOT ENFORCED DEFERRABLE INITIALLY DEFERRED DISABLE NOVALIDATE NORELY

属性(仅适用于外键)

以下约束属性 适用于外键(属性的顺序可互换):

MATCH { FULL | SIMPLE | PARTIAL }
ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
   [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
Copy
  • MATCH ... 指定了一列或多列中的 NULL 值是否满足外键约束。

  • ON ... 指定了更新或删除外键的主键时执行的操作。

  • 默认:

    MATCH FULL UPDATE NO ACTION DELETE NO ACTION

使用说明

  • NOT NULL 指定了列中不允许存在 NULL 值:

    • 这是 Snowflake 唯一 强制执行的约束。请参阅 参照完整性约束

    • 它只能指定为列定义中的内联约束。

    • 默认设置是允许列中存在 NULL 值。

  • 多列约束(例如复合唯一键或主键)只能定义为外联约束。

  • 在定义外键(无论内联还是外联)时,如果外键列的签名(即名称和数据类型)与引用表的主键列完全匹配,则不需要指定引用表的列名称。

  • 如果创建外键,则 REFERENCES 子句中列的顺序必须与主键中列的顺序相同。例如:

    create table parent ... constraint primary_key_1 primary key (c_1, c_2) ...
    create table child  ... constraint foreign_key_1 foreign key (...) REFERENCES parent (c_1, c_2) ...
    
    Copy

    在这两种情况下,列的顺序均为 c_1, c_2。如果外键中列的顺序不同(例如 c_2, c_1),则创建外键的尝试将失败。

示例

下面的示例显示了如何在创建表时创建简单的 NOT NULL 约束,以及如何在更改表时创建另一个 NOT NULL 约束:

创建表并同时创建约束:

CREATE TABLE table1 (
    col1 INTEGER NOT NULL
    );
Copy

更改表以添加具有约束的列:

ALTER TABLE table1 
    ADD COLUMN col2 VARCHAR NOT NULL;
Copy

下面的示例指定了列的目的是保存唯一值,但明确指出实际上并未强制执行该约束。此示例还演示了如何指定约束的名称(在本例中为“uniq_col3”。)

ALTER TABLE table1 
    ADD COLUMN col3 VARCHAR NOT NULL CONSTRAINT uniq_col3 UNIQUE NOT ENFORCED;
Copy

下面的示例创建了一个具有主键约束的父表和另一个具有外键约束的表,该外键约束指向与第一个表的主键约束相同的列。

CREATE TABLE table2 (
    col1 INTEGER NOT NULL,
    col2 INTEGER NOT NULL,
    CONSTRAINT pkey_1 PRIMARY KEY (col1, col2) NOT ENFORCED
    );
CREATE TABLE table3 (
    col_a INTEGER NOT NULL,
    col_b INTEGER NOT NULL,
    CONSTRAINT fkey_1 FOREIGN KEY (col_a, col_b) REFERENCES table2 (col1, col2) NOT ENFORCED
    );
Copy
语言: 中文