제약 조건의 개요

Snowflake는 다음과 같은 제약 조건 기능을 제공합니다.

  • ANSI SQL 표준의 제약 조건 유형. 자세한 내용은 지원되는 제약 조건 유형 섹션을 참조하십시오.

  • 명명된 제약 조건.

  • 단일 열 및 다중 열 제약 조건.

  • 인라인 및 아웃오브 라인으로 제약 조건 만들기.

  • 제약 조건 만들기, 수정, 삭제.

자세한 내용은 CREATE | ALTER TABLE … CONSTRAINT 섹션을 참조하십시오.

지원되는 제약 조건 유형

Snowflake는 ANSI SQL 표준에서 다음과 같은 제약 조건 유형을 지원합니다.

  • PRIMARY KEY: 열의 모든 값이 고유하고 열이 NULL 값을 저장할 수 없음을 보장합니다. 기본 키는 테이블의 각 행을 고유하게 식별합니다.

  • UNIQUE: 열의 모든 값이 고유하도록 보장합니다. PRIMARY KEY 제약 조건과 달리, UNIQUE 제약 조건이 있는 열에는 NULL 값이 포함될 수 있습니다.

  • FOREIGN KEY: 열 또는 열 세트의 값이 다른 테이블이나 동일한 테이블의 값과 일치하도록 요구하여 참조 무결성을 적용합니다.

  • NOT NULL: 열이 NULL 값을 저장할 수 없도록 보장합니다.

  • CHECK: 테이블의 하나 이상의 열에 삽입하거나 업데이트할 수 있는 값에 대한 조건으로 SQL 식을 적용합니다. 자세한 내용은 CHECK 제약 조건 섹션을 참조하십시오.

테이블에는 여러 개의 고유 키와 외래 키가 있을 수 있지만, 기본 키는 하나만 있을 수 있습니다. PRIMARY KEY 제약 조건은 열이 NOT NULL이자 UNIQUE임을 의미합니다.

모든 외래 키는 외래 키에 있는 각 열의 열 유형과 일치하는 해당 기본 키 또는 고유 키를 참조해야 합니다. 외래 키의 기본 키는 외래 키와 다른 테이블 또는 동일한 테이블에 있을 수 있습니다. 하이브리드 테이블 에 걸쳐 FOREIGN KEY 제약 조건을 정의하는 경우, 테이블은 동일한 데이터베이스에 있어야 합니다.

다음 테이블에는 제약 조건의 적용 및 제약 조건이 필요한지 여부와 관련하여 표준 테이블과 하이브리드 테이블 간에 동작의 차이점이 요약되어 있습니다.

  • 제약 조건은 특정 방식으로 열이 업데이트되지 않도록 보호하는 경우 적용 됩니다. 예를 들어, NOT NULL로 선언된 열은 NULL 값을 포함할 수 없습니다. NULL 값을 NOT NULL 열에 복사하거나 삽입하려고 시도하면 오류가 발생합니다. 하이브리드 테이블의 경우 PRIMARY KEY, FOREIGN KEY 및 UNIQUE 제약 조건에 NOT ENFORCED 속성을 설정할 수 없습니다. 이 속성을 설정하면 invalid constraint property 오류가 발생합니다.

  • 제약 조건은 테이블에서 하나 이상의 열에 그와 같은 제약 조건이 반드시 있어야 하는 경우 필수적 이며, 이는 하이브리드 테이블의 PRIMARY KEY 제약 조건에만 해당됩니다.

Feature

하이브리드 테이블

표준 테이블

PRIMARY KEY 제약 조건

필수, 적용됨

선택 사항, 적용되지 않음

FOREIGN KEY 제약 조건

선택 사항, 적용된 (참조 무결성)

선택 사항, 적용되지 않음

UNIQUE 제약 조건

선택 사항, 적용됨

선택 사항, 적용되지 않음

NOT NULL 제약 조건

선택 사항, 적용됨

선택 사항, 적용됨

CHECK 제약 조건

지원되지 않음

선택 사항, 적용됨

테이블 제약 조건

Snowflake는 영구적 테이블, 일시적 테이블, 임시 테이블, 하이브리드 테이블에 대한 제약 조건을 지원합니다. 모든 데이터 타입의 열에 대한 제약 조건을 정의할 수 있으며, 단일 제약 조건에는 열을 몇 개라도 포함할 수 있습니다.

제약 조건에 대한 고려 사항은 다음과 같습니다.

  • CREATE TABLE … LIKE 또는 CREATE TABLE … CLONE을 사용하여 테이블을 복사하면 외래 키를 포함하여 테이블의 모든 기존 제약 조건이 새 테이블에 복사됩니다. CREATE TABLE … CLONE은 하이브리드 테이블에 지원되지 않습니다.

  • DROP, UNDROP, GET_DDL과 같은 추가 명령 및 함수는 제약 조건이 있는 테이블에 대해 지원됩니다. 스키마와 데이터베이스에도 지원됩니다.

    Snowflake Time Travel 의 경우, Snowflake는 테이블 메타데이터에 이전 버전의 제약 조건을 저장하지 않으므로 이전 버전의 테이블을 복사할 때 테이블에서 현재 버전의 제약 조건이 사용됩니다.

단일 열 및 다중 열 제약 조건

동일한 테이블의 단일 열 또는 다중 열에 제약 조건을 정의할 수 있습니다.

다중 열 제약 조건(복합 기본 키 또는 고유 키)의 경우, 열이 정렬되고 각 열에는 해당 키 시퀀스가 있습니다.

인라인 및 아웃오브 라인 제약 조건

제약 조건은 테이블 만들기 또는 수정 중에 인라인 또는 아웃오브 라인으로 정의됩니다.

  • 인라인 제약 조건은 열 정의의 일부로 생성되고 단일 열 제약 조건에만 사용할 수 있습니다.

  • 아웃오브 라인 제약 조건은 제약 조건을 만든 열을 지정하는 별개의 절을 사용하여 정의됩니다. 단일 열 또는 다중 열 제약 조건 만들기뿐 아니라, 기존 열에 대한 제약 조건 만들기에도 이러한 제약 조건을 사용할 수 있습니다.

GET_DDL의 제약 조건

GET_DDL 에서 반환하는 SQL 문에는 제약 조건을 정의하는 절이 포함되지만, 다음 사항에 유의하세요.

  • NOT NULLDEFAULT 와 같은 단일 열 제약 조건은 열 정의와 함께 인라인으로 재구성됩니다.

  • 고유, 기본, 외래 키와 같은 테이블 제약 조건은 단일 열로 구성되어 있더라도 항상 아웃오브 라인 제약 조건으로 재구성됩니다.

  • 명명되지 않은 제약 조건(즉, 시스템에서 생성된 이름이 있는 제약 조건)의 경우, GET_DDL 은 시스템에서 생성된 이름을 반환하지 않습니다.

CHECK 제약 조건

CHECK 제약 조건은 테이블의 하나 이상의 열에 삽입하거나 업데이트할 수 있는 값에 대한 조건으로 SQL 식을 적용합니다. 예를 들어, CHECK 제약 조건은 테이블의 quantity 열에 0보다 큰 상수 값만 포함되도록 하거나 테이블의 salary 열에 특정 범위의 값만 포함되도록 할 수 있습니다.

다음 SQL 명령에서 CONSTRAINT 절 을 사용하여 CHECK 제약 조건을 지정할 수 있습니다.

CHECK_CONSTRAINTS 뷰 를 쿼리하여 기존 CHECK 제약 조건에 대한 정보를 표시할 수 있습니다.

다음 DML 작업 중에 검사 제약 조건이 적용됩니다.

조건이 TRUE 또는 NULL로 평가되는 경우, DML 작업이 진행됩니다. 조건이 FALSE로 평가되는 경우, CHECK 제약 조건이 실패합니다.

CHECK 제약 조건의 예제는 표준 테이블을 사용한 제약 조건의 예 섹션을 참조하세요.

사용법 노트

  • 검사 제약 조건은 항상 적용됩니다.

  • 다음 ALTER TABLE 명령과 Iceberg의 해당 명령을 사용하여 CHECK 제약 조건을 처리할 수 있습니다.

    • ALTER TABLE … RENAME CONSTRAINT

    • ALTER TABLE … ADD [ CONSTRAINT <constraint_name> ] CHECK ( <expr> ) ENABLE [ VALIDATE | NOVALIDATE ]

      • ENABLE VALIDATE, CHECK 제약 조건의 기본값은 모든 기존 행 및 명령 실행 후 삽입되거나 업데이트되는 모든 행에 대해 제약 조건을 적용합니다. ENABLE VALIDATE는 기존 테이블이 아닌 새 테이블에만 지원됩니다.

      • ENABLE NOVALIDATE는 명령을 실행한 후 삽입되거나 업데이트되는 모든 행에 제약 조건을 적용하지만, 기존 행에는 제약 조건을 적용하지 않습니다.

    • ALTER TABLE … ALTER CONSTRAINT <constraint_name> ENABLE [ VALIDATE | NOVALIDATE ]

      CHECK 제약 조건을 NOVALIDATE에서 VALIDATE로 변경하는 경우 VALIDATE로 변경되기 전에 모든 기존 행에 제약 조건이 적용됩니다.

    • ALTER TABLE … DROP CONSTRAINT

  • 다음 ALTER TABLE 명령과 Iceberg에 해당하는 명령은 정의된 CHECK 제약 조건이 있는 열에서 작동할 수 있습니다.

    • ALTER TABLE … ALTER COLUMN

      CHECK 제약 조건을 수정하지 않는 작업만 지원됩니다.

    • ALTER TABLE … RENAME COLUMN

      이름이 변경된 열을 참조하는 검사 제약 조건은 새 열 이름을 사용하도록 암시적으로 업데이트됩니다.

    • ALTER TABLE … DROP COLUMN

      삭제 중인 열이 다른 열을 참조하는 기존 CHECK 제약 조건에서 사용되는 경우 작업이 실패합니다. 이 경우 열을 삭제하기 전에 제약 조건을 삭제합니다.

  • 레코드가 수집 중에 CHECK 제약 조건을 위반하는 경우, 유효하지 않은 레코드를 처음 발견하면 전체 배치 작업이 실패합니다.

제한 사항

  • 표준 테이블과 Snowflake 관리 Iceberg 테이블만 CHECK 제약 조건을 지원합니다. 하이브리드 테이블과 같은 다른 유형의 테이블은 CHECK 제약 조건을 지원하지 않습니다.

  • 기존 CHECK 제약 조건과 연결된 식은 ALTER TABLE 명령을 사용하여 수정할 수 없습니다. 식을 수정하려면 CHECK 제약 조건을 삭제하고 다시 생성합니다.

  • CHECK 제약 조건은 CREATE OR ALTER TABLE 명령에 지정할 수 없습니다.

  • 다음 작업은 CHECK 제약 조건을 지원하지 않습니다.

    • CHECK 제약 조건이 있는 테이블을 COPY INTO하려고 시도하는 경우 작업이 실패합니다.

    • CHECK 제약 조건이 있는 대상 테이블로 파이프를 생성하려고 시도하는 경우 작업이 실패합니다.

    • CHECK 제약 조건이 있는 테이블로 스트리밍 수집을 시도하는 경우 작업이 실패합니다.

    • CHECK 제약 조건이 있는 Iceberg 테이블에서 외부 쓰기를 시도하는 경우 작업이 실패합니다.