CREATE | ALTER TABLE … CONSTRAINT

이 항목에서는 CREATE TABLE 또는 ALTER 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
  • { ENFORCED | NOT ENFORCED } 또는 { ENABLE | DISABLE } 이 지정되어 있을 때는 { VALIDATE | NOVALIDATE } 만 적용됩니다.

  • NOVALIDATE 가 지정되어 있을 때는 { RELY | NORELY } 만 적용됩니다.

  • 기본값:

    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