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 }
여기서:
inlineUniquePK ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY } [ [ NOT ] ENFORCED ] [ [ NOT ] DEFERRABLE ] [ INITIALLY { DEFERRED | IMMEDIATE } ] [ { ENABLE | DISABLE } ] [ { VALIDATE | NOVALIDATE } ] [ { RELY | NORELY } ]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 } ]
아웃오브 라인 고유/기본/외래 키¶
CREATE TABLE <name> ... ( <col1_name> <col1_type>
[ , <col2_name> <col2_type> , ... ]
[ , { outoflineUniquePK | outoflineFK } ]
[ , { outoflineUniquePK | outoflineFK } ]
[ , ... ] )
ALTER TABLE <name> ... ADD { outoflineUniquePK | outoflineFK }
여기서:
outoflineUniquePK ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] ) [ [ NOT ] ENFORCED ] [ [ NOT ] DEFERRABLE ] [ INITIALLY { DEFERRED | IMMEDIATE } ] [ { ENABLE | DISABLE } ] [ { VALIDATE | NOVALIDATE } ] [ { RELY | NORELY } ]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 } ]
제약 조건 속성¶
다른 데이터베이스와의 호환성을 위해, Snowflake는 제약 조건 속성을 제공합니다. 제약 조건에 대해 지정할 수 있는 속성은 다음과 같이 유형에 따라 다릅니다.
일부 속성은 모든 키(고유, 기본, 외래)에 적용됩니다.
외래 키에만 적용되는 다른 속성도 있습니다.
중요
다른 데이터베이스에서 쉽게 마이그레이션할 수 있도록 이러한 속성이 제공됩니다. Snowflake에서는 이들 속성을 적용하거나 유지 관리하지 않습니다. 이는 이러한 속성의 기본값을 변경할 수 있지만, 기본값을 변경하면 Snowflake에서 제약 조건을 만들지 않게 된다는 뜻입니다.
자세한 내용은 제약 조건 속성 섹션을 참조하십시오.
(모든 키의) 속성¶
다음 제약 조건 속성은 모든 키에 적용됩니다(속성의 순서는 상호 교환 가능).
[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
{ ENABLE | DISABLE }
{ VALIDATE | NOVALIDATE }
{ RELY | NORELY }
{ 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 } ]
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) ...
두 경우 모두 열의 순서는
c_1, c_2
입니다. 외래 키의 열 순서가 달랐다면(예:c_2, c_1
) 외래 키 생성 시도가 실패했을 것입니다.
예¶
아래 예에서는 테이블을 만드는 동안 간단한 NOT NULL 제약 조건을 만들고 테이블을 변경하는 동안 또 다른 NOT NULL 제약 조건을 만드는 방법을 보여줍니다.
테이블을 만드는 동시에 제약 조건 만들기:
CREATE TABLE table1 ( col1 INTEGER NOT NULL );제약 조건이 있는 열을 추가하도록 테이블 변경하기:
ALTER TABLE table1 ADD COLUMN col2 VARCHAR NOT NULL;
다음 예에서는 열의 의도가 고유한 값을 유지하는 것임을 지정하지만, 제약 조건이 실제로 적용되지 않음을 분명히 합니다. 이 예에서는 제약 조건의 이름(이 경우 “uniq_col3”)을 지정하는 방법도 설명합니다.
ALTER TABLE table1 ADD COLUMN col3 VARCHAR NOT NULL CONSTRAINT uniq_col3 UNIQUE NOT ENFORCED;
다음은 기본 키 제약 조건이 있는 부모 테이블과 첫 번째 테이블의 기본 키 제약 조건과 같은 열을 가리키는 외래 키 제약 조건이 있는 다른 테이블을 만드는 예입니다.
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 );