CREATE TABLE

현재/지정된 스키마에 새 테이블을 생성하거나 기존 테이블을 대체하거나 기존 테이블을 변경합니다. 이름, 데이터 타입 그리고 선택적으로 열이 다음과 같은지 여부로 구성된 각각의 열 정의를 사용하여 테이블에 여러 개의 열이 있을 수 있습니다.

  • 값(NOT NULL)이 필요한지 여부.

  • 기본값이 있는지 여부.

  • 참조 무결성 제약 조건(기본 키, 외래 키 등)이 있는지 여부.

또한, 이 명령은 다음 베리언트를 지원합니다.

  • CREATE OR ALTER TABLE(테이블이 존재하지 않으면 테이블을 생성하거나 테이블 정의에 따라 테이블을 변경합니다)

  • CREATE TABLE … AS SELECT(채워진 테이블을 생성하며 CTAS라고도 함)

  • CREATE TABLE … USING TEMPLATE(스테이징된 파일 세트에서 파생된 열 정의를 사용하여 테이블을 생성함)

  • CREATE TABLE … LIKE(기존 테이블의 빈 복사본을 생성함)

  • CREATE TABLE … CLONE(기존 테이블의 복제본을 생성함)

참고 항목:

ALTER TABLE , DROP TABLE , SHOW TABLES , DESCRIBE TABLE

구문

CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] PROJECTION POLICY <policy_name> ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Copy

여기서

inlineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE
    | PRIMARY KEY
    | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  }
  [ <constraint_properties> ]
Copy

추가 인라인 제약 조건의 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.

outoflineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ]
    | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ]
    | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ]
      REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  }
  [ <constraint_properties> ]
  [ COMMENT '<string_literal>' ]
Copy

추가 아웃오브 라인 제약 조건의 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.

참고

CREATE STAGE, ALTER STAGE, CREATE TABLE 또는 ALTER TABLE 명령을 사용하여 복사 옵션을 지정하지 마십시오. COPY INTO <테이블> 명령을 사용하여 복사 옵션을 지정하는 것이 좋습니다.

베리언트 구문

CREATE OR ALTER TABLE

테이블이 없으면 테이블을 생성하거나, 테이블 정의에 따라 테이블을 변경합니다. CREATE OR ALTER TABLE 구문은 CREATE TABLE 문의 규칙을 따르며 ALTERTABLE 문과 제한 사항이 동일합니다. 테이블이 변환되는 경우, 가능한 한 테이블의 기존 데이터는 보존됩니다. 열을 삭제해야 하는 경우 데이터 손실이 발생할 수 있습니다.

테이블을 변경할 때 다음 변경 사항이 지원됩니다.

  • 테이블 속성과 매개 변수를 변경합니다. 예: ENABLE_SCHEMA_EVOLUTION, DATA_RETENTION_TIME_IN_DAYS 또는 CLUSTER BY.

  • 열 데이터 타입, 기본값, Null 허용 여부, 설명 또는 자동 증가를 변경합니다.

  • 열 목록의 끝에 새로운 열을 추가합니다.

  • 열을 삭제합니다.

  • 라인 내 또는 라인 외 제약 조건을 추가, 삭제 또는 수정합니다.

  • 클러스터링 키를 추가, 삭제 또는 수정합니다.

자세한 내용은 CREATE OR ALTER TABLE 사용법 노트 섹션을 참조하십시오.

CREATE OR ALTER
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | TRANSIENT } ]
  TABLE <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COMMENT = '<string_literal>' ]
Copy

CREATE TABLE … AS SELECT(CTAS라고도 함)

쿼리에서 반환된 데이터로 채워진 새 테이블을 만듭니다.

CREATE [ OR REPLACE ] TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ COPY GRANTS ]
  AS <query>
  [ ... ]
Copy

마스킹 정책은 CTAS 문의 열에 적용할 수 있습니다. 열 데이터 타입 뒤에 마스킹 정책을 지정합니다. 마찬가지로 행 액세스 정책을 테이블에 적용할 수 있습니다. 예:

CREATE TABLE <table_name> ( <col1> <data_type> [ WITH ] MASKING POLICY <policy_name> [ , ... ] )
  ...
  [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col1> [ , ... ] )
  AS <query>
  [ ... ]
Copy

참고

CTAS에서 COPY GRANTS 절은 OR REPLACE 절과 결합된 경우에만 유효합니다. COPY GRANTS는 SELECT 문에서 쿼리되는 원본 테이블이 아니라, (이미 테이블이 있는 경우) CREATE OR REPLACE로 대체되는 테이블에서 권한을 복사합니다. COPY GRANTS를 사용한 CTAS로 해당 테이블에 대한 기존 권한을 유지하면서 새 데이터 세트로 테이블을 덮어쓸 수 있습니다.

COPY GRANTS에 대한 자세한 내용은 이 문서에 있는 COPY GRANTS 섹션을 참조하십시오.

CREATE TABLE … USING TEMPLATE

INFER_SCHEMA 함수를 사용하여 스테이징된 파일 세트에서 파생된 열 정의를 사용하여 새 테이블을 만듭니다. 이 기능은 Apache Parquet, Apache Avro, ORC, JSON 및 CSV 파일을 지원합니다.

CREATE [ OR REPLACE ] TABLE <table_name>
  [ COPY GRANTS ]
  USING TEMPLATE <query>
  [ ... ]
Copy

참고

이 문이 같은 이름의 기존 테이블을 대체하는 경우에는 대체되는 테이블에서 권한 부여가 복사됩니다. 그 이름의 기존 테이블이 없으면 복제되는 원본 테이블에서 권한 부여가 복사됩니다.

COPY GRANTS에 대한 자세한 내용은 이 문서에 있는 COPY GRANTS 섹션을 참조하십시오.

CREATE TABLE … LIKE

기존 테이블과 같은 열 정의를 사용하지만, 기존 테이블에서 데이터를 복사하지 않고 새 테이블을 만듭니다. 열 이름, 유형, 기본값, 제약 조건이 새 테이블에 복사됩니다.

CREATE [ OR REPLACE ] TABLE <table_name> LIKE <source_table>
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ COPY GRANTS ]
  [ ... ]
Copy

COPY GRANTS에 대한 자세한 내용은 이 문서에 있는 COPY GRANTS 섹션을 참조하십시오.

참고

데이터 공유를 통해 액세스되는 자동 증분 시퀀스가 있는 테이블에 대한 CREATE TABLE … LIKE는 현재 지원되지 않습니다.

CREATE TABLE … CLONE

데이터를 실제로 복사하지 않고 원본 테이블의 모든 기존 데이터를 포함하고 똑같은 열 정의를 사용하여 새 테이블을 만듭니다. 다음과 같이 이 베리언트를 사용하여 과거의 특정 시간/지점에 테이블을 복제할 수도 있습니다(Time Travel 사용).

CREATE [ OR REPLACE ]
    [ {
          [ { LOCAL | GLOBAL } ] TEMP [ READ ONLY ] |
          TEMPORARY [ READ ONLY ] |
          VOLATILE |
          TRANSIENT
    } ]
  TABLE <name> CLONE <source_table>
    [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
    [ COPY GRANTS ]
    [ ... ]
Copy

참고

이 문이 같은 이름의 기존 테이블을 대체하는 경우에는 대체되는 테이블에서 권한 부여가 복사됩니다. 그 이름의 기존 테이블이 없으면 복제되는 원본 테이블에서 권한 부여가 복사됩니다.

COPY GRANTS에 대한 자세한 내용은 이 문서에 있는 COPY GRANTS 섹션을 참조하십시오.

복제에 대한 세부 정보는 CREATE <오브젝트> … CLONE 을 참조하십시오.

필수 매개 변수

name

테이블의 식별자(즉, 이름)를 지정하며, 테이블이 생성되는 스키마에 대해 고유해야 합니다.

또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: "My object")로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.

자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

col_name

열 식별자(예: 이름)를 지정합니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.

자세한 내용은 식별자 요구 사항예약된 키워드와 제한된 키워드 섹션을 참조하십시오.

참고

표준 예약 키워드 외에, 다음 키워드는 ANSI 표준 컨텍스트 함수용으로 예약되어 있으므로 열 식별자로 사용할 수 없습니다.

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

예약된 키워드의 목록은 예약된 키워드와 제한된 키워드 를 참조하십시오.

col_type

열의 데이터 타입을 지정합니다.

테이블 열에 지정할 수 있는 데이터 타입에 대한 자세한 내용은 SQL 데이터 타입 참조 을 참조하십시오.

query

CTAS 및 USING TEMPLATE에 필수입니다.

  • CTAS의 경우 테이블을 채우는 SELECT 문 을 지정합니다.

  • CREATE TABLE … USING TEMPLATE의 경우 INFER_SCHEMA 함수를 호출하고 출력 형식을 배열로 지정하는 하위 쿼리를 지정합니다. 또는 USING TEMPLATE 은 INFER_SCHEMA 출력을 문자열 리터럴 또는 변수로 받아들입니다.

source_table

LIKE 및 CLONE에 필수입니다.

  • CREATE TABLE … LIKE의 경우 속성 및 열 정의가 복사되는 테이블을 지정합니다.

  • CREATE TABLE … CLONE의 경우 복제의 원본으로 사용할 테이블을 지정합니다.

선택적 매개 변수

{ [ { LOCAL | GLOBAL } ] TEMP [ READ ONLY] | ` :newline:.` TEMPORARY [ READ ONLY] | . VOLATILE | ` :newline:.` TRANSIENT }

테이블을 생성한 세션 의 지속 시간 동안만 테이블이 유지되도록 지정합니다. 세션이 끝나면 임시 테이블과 모든 내용이 삭제됩니다.

다른 데이터베이스와의 호환성을 위해 TEMPORARY (예: GLOBAL TEMPORARY)의 동의어와 약어가 제공됩니다(예: CREATE TABLE 문을 마이그레이션할 때 오류 방지). 이러한 키워드로 만든 테이블은 TEMPORARY 키워드로 만든 테이블과 똑같이 나타나고 동작합니다.

기본값: 값 없음. 테이블이 TEMPORARY 또는 TRANSIENT 로 선언되지 않은 경우 테이블은 영구적입니다.

예기치 않은 충돌을 방지하려면 스키마에 이미 있는 테이블을 따라 임시 테이블의 이름을 지정하지 마십시오.

스키마의 다른 테이블과 이름이 같은 임시 테이블을 만든 경우 테이블에 사용된 모든 쿼리와 작업은 임시 테이블을 삭제할 때까지 세션의 임시 테이블에만 영향을 미칩니다. 테이블을 삭제하면 스키마에 이미 존재하는 테이블이 아닌 임시 테이블이 삭제됩니다.

임시 또는 일시적 테이블에 대한 정보와 이 정보가 저장소 및 비용에 미치는 영향은 다음 리소스를 참조하십시오.

READ ONLY

테이블을 읽기 전용으로 지정합니다. READ ONLY는 CREATE TABLE 명령의 CREATE TABLE … CLONE 변형으로 생성되는 임시 테이블에만 유효합니다.

읽기 전용 테이블은 DML 연산을 허용하지 않으며 다음과 같은 DDL 연산의 하위 집합만 허용합니다.

  • ALTER TABLE … { ALTER | MODIFY } COLUMN … { SET | UNSET } COMMENT

  • ALTER TABLE … { ALTER | MODIFY } COLUMN … { SET | UNSET } MASKING POLICY

  • ALTER TABLE … { ALTER | MODIFY } COLUMN … { SET | UNSET } TAG

  • ALTER TABLE … RENAME COLUMN … TO

  • ALTER TABLE … RENAME TO

  • ALTER TABLE … { SET | UNSET } COMMENT

  • ALTER TABLE … { SET | UNSET } TAG

  • COMMENT

  • DESCRIBE

  • DROP

  • SHOW

  • UNDROP

읽기 전용 테이블에는 METADATA$ROW_POSITION 열이 있습니다. 이 메타데이터 열은 테이블의 각 행에 0부터 시작하는 연속 행 번호를 지정합니다. 각 행에 할당된 행 번호는 읽기 전용 테이블이 삭제될 때까지 변경되지 않습니다.

TRANSIENT

테이블이 일시적 테이블임을 지정합니다.

영구 테이블과 마찬가지로, 일시적 테이블은 명시적으로 삭제될 때까지 존재하며 적절한 권한이 있는 어떤 사용자라도 볼 수 있습니다. 하지만 일시적 테이블은 영구 테이블보다 데이터 보호 수준이 낮은데, 이는 곧 시스템 장애가 발생할 경우 일시적 테이블의 데이터가 손실될 수 있다는 뜻입니다. 이와 같이, 일시적 테이블은 Snowflake 외부에서 다시 만들 수 있는 데이터에만 사용해야 합니다.

기본값: 값 없음. 테이블이 TRANSIENT 또는 TEMPORARY 로 선언되지 않은 경우 테이블은 영구적입니다.

참고

일시적 테이블에는 몇 가지 저장소 고려 사항이 있습니다.

임시 테이블을 만들지, 일시적 테이블을 만들지 결정할 때 이러한 고려 사항과 다른 고려 사항에 대한 자세한 내용은 임시 및 일시적 테이블 관련 작업하기Time Travel 및 Fail-safe 관련 저장소 요금 을 참조하십시오.

CONSTRAINT ...

테이블에서 지정한 열에 대한 인라인 또는 아웃오브 라인 제약 조건을 정의합니다.

구문 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오. 제약 조건에 대한 자세한 내용은 제약 조건 을 참조하십시오.

COLLATE 'collation_specification'

문자열 비교와 같은 열 작업에 사용할 데이터 정렬을 지정합니다. 이 옵션은 텍스트 열(VARCHAR, STRING, TEXT 등)에만 적용됩니다. 자세한 내용은 데이터 정렬 사양 섹션을 참조하십시오.

DEFAULT ... 또는 . AUTOINCREMENT ...

INSERT 또는 CREATE TABLE AS SELECT 문을 통해 값이 명시적으로 지정되지 않은 경우 기본값이 열에 자동으로 삽입되는지 여부를 지정합니다.

DEFAULT expr

열 기본값은 다음 중 하나일 수 있는 지정된 식으로 정의됩니다.

  • 상수 값.

  • 시퀀스 참조 (seq_name.NEXTVAL).

  • 스칼라 값을 반환하는 간단한 식입니다.

    UDF가 보안 UDF 가 아닌 경우 이 간단한 식은 SQL UDF(사용자 정의 함수)를 포함할 수 있습니다.

    참고

    기본 식이 SQL UDF를 참조하는 경우에는 해당 함수가 테이블 생성 시 해당 정의로 대체됩니다. 사용자 정의 함수가 나중에 다시 정의되더라도 열의 기본 식이 업데이트되지는 않습니다.

    이 간단한 식은 다음에 대한 참조를 포함할 수 없습니다.

    • 하위 쿼리.

    • 집계.

    • 윈도우 함수.

    • 보안 UDF.

    • SQL 이외의 언어로 작성된 UDF(예: Java, JavaScript).

    • 외부 함수.

{ AUTOINCREMENT | IDENTITY } . [ { ( start_num , step_num ) | START num INCREMENT num } ] . [ { ORDER | NOORDER } ]

AUTOINCREMENT 또는 IDENTITY를 지정할 때 열의 기본값은 지정된 숫자로 시작하고 각각의 연속 값은 지정된 양만큼 자동으로 증가합니다.

AUTOINCREMENT와 IDENTITY는 동의어로서 NUMBER, INT, FLOAT와 같은 숫자 데이터 타입의 열에만 사용할 수 있습니다.

조심

Snowflake는 시퀀스를 사용하여 자동 증가 열의 값을 생성합니다. 시퀀스에는 제한이 있습니다. 시퀀스 의미 체계 섹션을 참조하십시오.

시작 값과 단계/증분 값 모두 기본값은 1 입니다.

참고

AUTOINCREMENT 또는 IDENTITY 열에 값을 수동으로 삽입하면 값이 중복될 수 있습니다. AUTOINCREMENT 또는 IDENTITY 열에 값 5 를 수동으로 삽입하면 이후에 삽입된 행에 열의 기본값과 동일한 값 5 가 사용될 수 있습니다.

ORDER 또는 NOORDER를 사용하여 자동 증분 열에 대한 값이 오름차순 또는 내림차순 으로 생성되는지 여부를 지정합니다.

  • ORDER를 지정하면 시퀀스 또는 자동 증분 열에 대해 생성되는 값이 오름차순(또는 간격이 음수 값인 경우에는 내림차순)으로 표시됩니다.

    예를 들어 시퀀스 또는 자동 증가 열에 START 1 INCREMENT 2 가 있는 경우 생성된 값은 1, 3, 5, 7, 9 등이 될 수 있습니다.

  • NOORDER를 지정하면 값이 오름차순으로 표시되도록 보장되지 않습니다.

    예를 들어 시퀀스에 START 1 INCREMENT 2 가 있는 경우 생성된 값은 1, 3, 101, 5, 103 등이 될 수 있습니다.

    NOORDER는 여러 INSERT 작업이 동시에 수행되는 경우(예: 여러 클라이언트가 여러 INSERT 문을 실행하는 경우) 성능을 향상시킬 수 있습니다.

ORDER 또는 NOORDER를 지정하지 않으면 NOORDER_SEQUENCE_AS_DEFAULT 매개 변수에 따라 설정되는 속성이 결정됩니다.

참고

DEFAULT 와 AUTOINCREMENT 는 상호 배타적이며 한 열에 하나만 지정할 수 있습니다.

MASKING POLICY = policy_name

열에 설정할 마스킹 정책 을 지정합니다.

이 매개 변수는 CREATE OR ALTER 변형 구문에서 지원되지 않습니다.

PROJECTION POLICY policy_name

열에 설정할 마스킹 정책 을 지정합니다.

이 매개 변수는 CREATE OR ALTER 변형 구문에서 지원되지 않습니다.

COMMENT 'string_literal'

열에 대한 설명을 지정합니다.

(열 수준 또는 테이블 수준에서 설명을 지정할 수 있습니다. 각 설명에 대한 구문은 약간 다릅니다.)

USING ( col_name , cond_col_1 ... )

조건부 마스킹 정책 SQL 식에 전달할 인자를 지정합니다.

목록의 첫 번째 열은 데이터를 마스킹하거나 토큰화할 정책 조건에 대한 열을 지정하며, 마스킹 정책이 설정된 열과 반드시 일치해야 합니다.

추가 열은 첫 번째 열에 대해 쿼리가 수행될 때 쿼리 결과의 각 행에 있는 데이터를 마스킹할지 또는 토큰화할지 결정하기 위해 평가할 열을 지정합니다.

USING 절을 생략하면 Snowflake는 조건부 마스킹 정책을 일반 마스킹 정책 으로 취급합니다.

CLUSTER BY ( expr [ , expr , ... ] )

테이블에서 하나 이상의 열 또는 열 식을 클러스터링 키로 지정합니다. 자세한 내용은 클러스터링 키 및 클러스터링된 테이블 섹션을 참조하십시오.

기본값: 값 없음(테이블에 대해 정의된 클러스터링 키가 없음)

중요

클러스터링 키는 모든 테이블에 대해 의도되거나 권장되지 않으며, 일반적으로 매우 큰(즉, 멀티 테라바이트 크기의) 테이블에 이점이 있습니다.

테이블에 대한 클러스터링 키를 지정하기 전에 마이크로 파티션을 이해해야 합니다. 자세한 내용은 Snowflake 테이블 구조 이해하기 섹션을 참조하십시오.

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

다음을 포함하여 원본 파일에서 테이블로 로드된 데이터에서 테이블 스키마에 대한 자동 변경을 활성화하거나 비활성화합니다.

  • 열을 추가했습니다.

    기본적으로 스키마 진화는 로드 작업당 최대 10개의 추가된 열로 제한됩니다. 로드 작업당 추가되는 열을 10개보다 많이 요청하려면 Snowflake 지원팀 에 문의하십시오.

  • 새 데이터 파일에서 누락된 열 수에 상관없이 NOT NULL 제약 조건을 삭제할 수 있습니다.

TRUE 로 설정하면 자동 테이블 스키마 진화가 활성화됩니다. 기본 옵션인 FALSE 를 그대로 사용하면 자동 테이블 스키마 진화가 비활성화됩니다.

참고

파일에서 데이터를 로드하면 다음이 모두 true일 때 테이블 열이 진화합니다.

  • COPY INTO <테이블> 문은 MATCH_BY_COLUMN_NAME 옵션을 포함합니다.

  • 데이터를 로드하는 데 사용되는 역할에는 테이블에 대한 EVOLVE SCHEMA 또는 OWNERSHIP 권한이 있습니다.

또한 CSV를 사용한 스키마 진화의 경우 MATCH_BY_COLUMN_NAMEPARSE_HEADER 와 함께 사용할 때 ERROR_ON_COLUMN_COUNT_MISMATCH 를 false로 설정해야 합니다.

DATA_RETENTION_TIME_IN_DAYS = integer

테이블에서 레코드 데이터에 대해 Time Travel 작업(SELECT, CLONE, UNDROP)을 수행할 수 있도록 테이블의 보존 기간을 지정합니다. 자세한 내용은 Time Travel 이해 및 사용하기임시 및 일시적 테이블 관련 작업하기 섹션을 참조하십시오.

이 오브젝트 수준 매개 변수에 대한 자세한 설명과 아울러 오브젝트 매개 변수에 대한 자세한 내용은 매개 변수 를 참조하십시오.

값:

  • Standard Edition: 0 또는 1

  • Enterprise Edition:

    • 영구 테이블의 경우 0 ~ 90

    • 임시 테이블과 일시적 테이블의 경우 0 또는 1

기본값:

  • Standard Edition: 1

  • Enterprise Edition 또는 그 이상: 1 (스키마, 데이터베이스 또는 계정 수준에서 다른 기본값이 지정되지 않은 경우)

참고

0 의 값은 테이블의 Time Travel을 효과적으로 비활성화합니다.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Snowflake가 테이블의 스트림이 부실해지는 것을 방지하기 위해 테이블의 데이터 보존 기간을 연장할 수 있는 최대 일수를 지정하는 오브젝트 매개 변수입니다.

이 매개 변수에 대한 자세한 설명은 MAX_DATA_EXTENSION_TIME_IN_DAYS 섹션을 참조하십시오.

CHANGE_TRACKING = { TRUE | FALSE }

테이블에서 변경 내용 추적을 활성화할지 지정합니다.

  • TRUE 로 지정하면 테이블에서 변경 내용 추적이 활성화됩니다. 이 설정을 선택하면 소스 테이블에 한 쌍의 숨겨진 열이 추가되고 열에 변경 내용 추적 메타데이터가 저장되기 시작합니다. 이러한 열은 소량의 저장소를 사용합니다.

    SELECT 문에 CHANGES 절을 사용하거나 테이블에서 하나 이상의 스트림을 만들고 쿼리하여 변경 내용 추적 메타데이터를 쿼리할 수 있습니다.

  • FALSE 로 지정하면 테이블에서 변경 내용 추적이 활성화되지 않습니다.

기본값: FALSE

DEFAULT_DDL_COLLATION = 'collation_specification'

향후 테이블에 추가되는 열을 포함하여, 테이블의 열에 대한 기본 데이터 정렬 사양 을 지정합니다.

이 매개 변수에 대한 자세한 내용은 DEFAULT_DDL_COLLATION 을 참조하십시오.

COPY GRANTS

다음 CREATE TABLE 베리언트 중 하나를 사용하여 새 테이블을 만들 때 원본 테이블의 액세스 권한을 유지하도록 지정합니다.

  • CREATE OR REPLACE TABLE

  • CREATE TABLE … LIKE

  • CREATE TABLE … CLONE

이 매개 변수는 OWNERSHIP을 제외한 모든 권한을 기존 테이블에서 새 테이블로 복사합니다. 새 테이블은 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속하지는 않습니다. 기본적으로, CREATE TABLE 문을 실행하는 역할은 새 테이블을 소유합니다.

CREATE TABLE 문에 이 매개 변수가 포함되지 않은 경우에는 새 테이블이 원본 테이블에 부여된 모든 명시적인 액세스 권한을 상속하지 않지만, 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속하지는 않습니다.

참고:

  • 데이터 공유 사용 시:

    • 기존 테이블을 다른 계정과 공유한 경우 대체 테이블도 공유됩니다.

    • 기존 테이블을 데이터 컨슈머로서 자신의 계정과 공유하고 (부모 데이터베이스에서 GRANT IMPORTED PRIVILEGES 를 사용하여) 계정의 다른 역할에 추가로 액세스 권한을 부여한 경우 대체 테이블에도 액세스 권한이 부여됩니다.

  • 대체 테이블에 대한 SHOW GRANTS 출력에는 CREATE TABLE 문이 실행될 때 현재 타임스탬프를 포함한 이 문을 실행한 역할로서 복사된 권한의 피부여자가 나열됩니다.

  • 권한 부여 복사 작업은 CREATE TABLE 명령에서 원자적으로(즉, 같은 트랜잭션 내에서) 발생합니다.

  • 이 매개 변수는 CREATE OR ALTER 변형 구문에서 지원되지 않습니다.

COMMENT = 'string_literal'

테이블에 대한 설명을 지정합니다.

기본값: 값 없음

(열 수준, 제약 조건 수준 또는 테이블 수준에서 설명을 지정할 수 있습니다. 각 설명에 대한 구문은 약간 다릅니다.)

ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )

테이블에 설정할 행 액세스 정책 을 지정합니다.

이 매개 변수는 CREATE OR ALTER 변형 구문에서 지원되지 않습니다.

AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]

테이블에 설정할 집계 정책 을 지정합니다.

선택적 ENTITY KEY 매개 변수를 사용하여 테이블 내에서 엔터티의 ID를 고유하게 지정하는 열을 정의할 수 있습니다. 자세한 내용은 집계 정책을 사용하여 엔터티 수준 개인정보 보호 구현하기 섹션을 참조하십시오.

이 매개 변수는 CREATE OR ALTER 변형 구문에서 지원되지 않습니다.

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

태그 이름과 태그 문자열 값을 지정합니다.

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256자입니다.

문에서 태그를 지정하는 방법에 대한 자세한 내용은 오브젝트 및 열에 대한 태그 할당량 섹션을 참조하십시오.

이 매개 변수는 CREATE OR ALTER 변형 구문에서 지원되지 않습니다.

액세스 제어 요구 사항

이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.

권한

오브젝트

참고

CREATE TABLE

스키마

임시 테이블을 만들 때는 CREATE TABLE 권한이 필요하지 않습니다.

SELECT

테이블, 외부 테이블, 뷰

테이블을 복제하거나 CTAS 문을 실행할 때만 쿼리된 테이블 및/또는 뷰에 필요합니다.

APPLY

마스킹 정책, 행 액세스 정책, 태그

테이블 생성 시 마스킹 정책, 행 액세스 정책, 오브젝트 태그 또는 이러한 거버넌스 기능의 조합을 적용할 때만 필요합니다.

USAGE(외부 스테이지) 또는 READ(내부 스테이지)

스테이지

CREATE TABLE … USING TEMPLATE 문을 사용하여 스테이징된 파일에서 테이블 열 정의를 파생하는 데 필요합니다.

OWNERSHIP

테이블

  • 스키마에 이미 존재하는 오브젝트와 동일한 이름을 가진 임시 오브젝트를 생성하려면 오브젝트에 대한 OWNERSHIP 권한을 역할에 부여하거나 상속해야 합니다.

  • 기존 테이블에 대한 CREATE OR ALTER TABLE 문을 실행하는 데 필요합니다.

OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege).

Note that in a managed access schema, only the schema owner (i.e. the role with the OWNERSHIP privilege on the schema) or a role with the MANAGE GRANTS privilege can grant or revoke privileges on objects in the schema, including future grants.

스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.

지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.

보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.

사용법 노트

  • 스키마는 이름이 같은 테이블 및/또는 뷰를 포함할 수 없습니다. 테이블을 만들 때는 다음 사항이 적용됩니다.

    • 스키마에 같은 이름의 뷰가 이미 있는 경우 오류가 반환되고 테이블이 생성되지 않습니다.

    • 같은 이름의 테이블이 스키마에 이미 있는 경우 명령에 선택적인 OR REPLACE 키워드를 포함하지 않는 한 오류가 반환되고 테이블이 생성되지 않습니다.

      중요

      OR REPLACE 를 사용하는 것은 기존 테이블에서 DROP TABLE 를 사용한 다음 같은 이름을 가진 새 테이블을 만드는 것과 같습니다. 하지만 삭제된 테이블이 시스템에서 영구적으로 제거되는 것은 아닙니다. 대신, 삭제된 데이터베이스는 Time Travel에 보존됩니다. Time Travel에서 삭제된 테이블은 복구할 수 있지만 계정의 데이터 저장소에도 기여하므로 이 점을 유념해야 합니다. 자세한 내용은 Time Travel 및 Fail-safe 관련 저장소 요금 섹션을 참조하십시오.

      CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.

      이는 CREATE OR REPLACE TABLE 작업과 동시에 수행되는 모든 쿼리가 이전 또는 새 테이블 버전을 사용함을 의미합니다.

      테이블을 다시 만들거나 바꾸면 변경 데이터가 삭제됩니다. 테이블의 모든 스트림은 부실 상태가 됩니다. 또한 이 테이블을 기본 테이블로 포함하는 뷰의 모든 스트림은 부실 상태가 됩니다. 부실 스트림은 읽을 수 없습니다.

  • 예약된 키워드 와 마찬가지로, ANSI로 예약된 함수 이름(CURRENT_DATE, CURRENT_TIMESTAMP 등)을 열 이름으로 사용할 수 없습니다.

  • CREATE OR ALTER TABLE:

    자세한 내용은 CREATE OR ALTER TABLE 사용법 노트 섹션을 참조하십시오.

  • CREATE TABLE … CLONE:

    원본 테이블에 클러스터링 키가 있으면 새 테이블에 클러스터링 키가 있습니다. 기본적으로, 원본 테이블에 대해 자동 클러스터링이 일시 중단되지 않았더라도 자동 클러스터링은 새 테이블에 대해 일시 중단됩니다.

  • CREATE TABLE … CHANGE_TRACKING = TRUE:

    변경 내용 추적이 활성화되면 작업 기간 동안 테이블이 잠깁니다. 잠금으로 인해 연결된 몇몇 DDL/DML 작업에서 지연이 발생할 수 있습니다. 자세한 내용은 리소스 잠금 섹션을 참조하십시오.

  • CREATE TABLE … LIKE:

    원본 테이블에 클러스터링 키가 있으면 새 테이블에 클러스터링 키가 있습니다. 기본적으로, 원본 테이블에 대해 자동 클러스터링이 일시 중단되었더라도 자동 클러스터링은 새 테이블에 대해 일시 중단되지 않습니다.

  • CREATE TABLE … AS SELECT(CTAS):

    • SELECT 목록에 있는 열 이름의 별칭이 유효한 열이면 CTAS 문에 열 정의가 필요하지 않습니다. 열 이름과 유형이 생략된 경우 이들은 기본 쿼리에서 유추됩니다.

      CREATE TABLE <table_name> AS SELECT ...
      
      Copy

      또는 다음 구문을 사용하여 이름을 명시적으로 지정할 수 있습니다.

      CREATE TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
      
      Copy

      지정된 열 이름의 개수는 쿼리의 SELECT 목록 항목 개수와 일치해야 하며, 열의 유형은 쿼리로 생성된 유형에서 유추됩니다.

    • 클러스터링 키가 CTAS 문에 지정된 경우:

      • 열 정의가 필요하며 문에 명시적으로 이를 지정해야 합니다.

      • 기본적으로, 원본 테이블에 대해 자동 클러스터링이 일시 중단되더라도 자동 클러스터링은 새 테이블에 대해 일시 중단되지 않습니다.

    • 특정 순서의 행이 있는 테이블을 만들려면 CTAS의 SELECT 절에서 ORDER BY 하위 절을 사용하십시오. CLUSTER BY를 지정하면 테이블이 생성될 때 데이터를 클러스터링하지 않는 대신, CLUSTER BY는 자동 클러스터링 에 의존하여 시간의 경과에 따라 데이터를 다시 클러스터링합니다.

      CREATE TABLE 문의 ORDER BY 하위 절은 해당 테이블에서 이후에 SELECT 문을 통해 반환되는 행의 순서에 영향을 주지 않습니다. 이후의 SELECT 문에서 행의 순서를 지정하려면 해당 문에서 ORDER BY 하위 절을 사용하십시오.

  • 트랜잭션 내에서 모든 DDL 문(CREATE TEMPORARY/TRANSIENT TABLE 포함)은 트랜잭션을 커밋한 후에 DDL 문 자체를 실행합니다. 그러면 DDL 문이 자체 트랜잭션에서 실행됩니다. DDL 문 뒤의 다음 문이 새 트랜잭션을 시작합니다. 따라서 단일 트랜잭션 내에서 임시 테이블이나 일시적 테이블을 만들고 사용하고 삭제할 수 없습니다. 트랜잭션 내에서 임시 테이블이나 일시적 테이블을 사용하려면 트랜잭션 전에 테이블을 만들고 트랜잭션 후에 테이블을 삭제하십시오.

  • (선택적 OR REPLACE 키워드를 사용하여) 테이블을 다시 만들면 기록이 삭제되고, 이로 인해 테이블의 스트림이 부실해집니다. 부실 스트림은 읽을 수 없습니다.

  • 조건부 열을 사용하는 단일 마스킹 정책은 테이블의 열 구조가 정책에 지정된 열과 일치하는 경우 여러 테이블에 적용할 수 있습니다.

  • 하나 이상의 테이블 열에 마스킹 정책을 사용하여 테이블을 생성하거나, 테이블에 추가된 행 액세스 정책을 생성할 때, POLICY_CONTEXT 함수를 사용하여, 마스킹 정책에 의해 보호되는 열 및 행 액세스 정책에 의해 보호되는 테이블에 대한 쿼리를 시뮬레이션합니다.

  • 메타데이터 관련:

    주의

    고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

CREATE OR ALTER TABLE 사용법 노트

  • 제한 사항

    • 현재는 영구 테이블, 임시 테이블, 일시적 테이블만 지원됩니다. 읽기 전용 테이블, 외부 테이블, 동적 테이블, Apache Iceberg™ 테이블 및 하이브리드 테이블은 지원되지 않습니다.

    • ALTER TABLE 명령의 모든 제한 사항이 적용됩니다.

    • 현재는 다음을 지원하지 않습니다.

      • CREATE TABLE … AS SELECT (CTAS) 변형 구문.

      • CREATE TABLE … USING TEMPLATE 변형 구문.

      • CREATE TABLE … LIKE 변형 구문.

      • CREATE TABLE … CLONE 변형 구문.

  • 테이블 매개 변수 및 속성

    • 이전에 수정된 테이블 정의에 설정된 속성이나 매개 변수가 없으면 해당 테이블 정의가 설정 해제됩니다.

    • 명시적 매개 변수 값을 설정 해제하면 기본 매개 변수 값으로 설정됩니다. 테이블이 포함된 스키마나 데이터베이스에 매개 변수가 설정된 경우, 테이블은 스키마나 데이터베이스에 설정된 매개 변수 값을 상속받습니다.

  • 데이터 거버넌스

    • CREATE OR ALTER TABLE 문을 사용하여 테이블 또는 열에 태그 또는 정책을 설정하거나 설정 해제하는 기능은 지원되지 않습니다.

      기존 정책 또는 태그는 CREATE OR ALTER 정책에 의해 변경되지 않으며, 변경되지 않은 상태로 유지됩니다.

  • 제약 사항

    인라인 기본 키를 설정하거나 설정 해제하면 그에 따라 열의 null 허용 여부가 변경됩니다. 이는 CREATE TABLE 명령의 동작과 일치하지만 ALTER TABLE 명령의 동작과는 다릅니다.

    • 새로운 열은 열 목록의 끝에만 추가할 수 있습니다.

    • 열의 이름은 바꿀 수 없습니다. 열 이름 바꾸기를 시도하면 해당 열이 삭제되고 새 열이 추가됩니다.

    • 열의 기본값은 시퀀스를 사용하도록만 수정할 수 있습니다.

    • 열의 기본 시퀀스(예: SET DEFAULT seq_name.NEXTVAL)는 열에 이미 시퀀스가 있는 경우에만 변경할 수 있습니다.

    • 열 수정에 대한 자세한 내용은 ALTER TABLE … ALTER COLUMN 섹션을 참조하십시오.

  • 데이터 정렬

    • 정렬 사양은 변경할 수 없습니다.

    • CREATE OR ALTER TABLE 명령에서 DEFAULT_DDL_COLLATION 매개 변수를 설정하면 기존 열에 대한 기본 데이터 정렬 사양이 설정되므로 CREATE OR ALTER TABLE 명령이 CREATE TABLE 명령과 동일한 결과를 생성합니다. 따라서 기존 텍스트 열이 있는 테이블에서는 CREATE OR ALTER TABLE 명령을 사용하여 DEFAULT_DDL_COLLATION 매개 변수를 설정할 수 없습니다. 그러나 테이블의 DEFAULT_DDL_COLLATION 매개 변수를 변경할 때 기존 열에 대해 데이터 정렬을 명시적으로 지정할 수 있습니다.

      예를 들어, 새 테이블 my_table 을 만들고 테이블의 기본 데이터 정렬 사양을 ‘fr’로 설정합니다

      CREATE OR ALTER TABLE my_table (
        a INT PRIMARY KEY,
        b VARCHAR(20)
      )
      DEFAULT_DDL_COLLATION = 'fr';
      
      Copy

      b 열의 데이터 정렬 사양은 ‘fr’이며 변경할 수 없습니다. 테이블 my_table 에 대한 기본 데이터 정렬 사양을 변경하려면 CREATE OR ALTER 문에서 텍스트 열 b 에 대한 데이터 정렬을 명시적으로 설정해야 합니다.

      CREATE OR ALTER TABLE my_table (
        a INT PRIMARY KEY,
        b VARCHAR(200) COLLATE 'fr'
      )
      DEFAULT_DDL_COLLATION = 'de';
      
      Copy
  • 원자성

    현재 CREATE OR ALTER TABLE 명령은 원자성을 보장하지 않습니다. 즉, 실행 중에 CREATE OR ALTER TABLE 문이 실패하는 경우 변경 사항의 하위 집합이 테이블에 적용되었을 수 있습니다. 부분적인 변경 가능성이 있는 경우 대부분의 경우 오류 메시지에는 다음 텍스트가 포함됩니다.

    CREATE OR ALTER execution failed. Partial updates may have been applied.
    

    예를 들어, 문이 테이블에 열 A 를 삭제하고 새 열 B 를 추가하려고 하는데 문이 중단되는 경우 열 A 는 삭제되었지만 열 B 는 추가되지 않았을 수 있습니다.

    참고

    변경 사항이 부분적으로 적용된 경우 결과 테이블은 여전히 유효한 상태이며 추가 ALTER TABLE 문을 사용하여 원래의 변경 결과 세트를 완료할 수 있습니다.

    부분 업데이트에서 복구하려면 Snowflake에서 다음 복구 메커니즘을 권장합니다.

    • 순방향 수정

      • CREATE OR ALTER TABLE 문을 다시 실행합니다. 두 번째 시도에서 문이 성공하면 목표 상태를 달성한 것입니다.

      • 오류 메시지를 조사합니다. 가능한 경우 오류를 수정하고 CREATE OR ALTER TABLE 문을 다시 실행합니다.

    • 롤백

      순방향 수정을 수행할 수 없는 경우 Snowflake는 부분적인 변경 사항을 수동으로 롤백하는 것을 권장합니다.

      • DESCRIBE TABLESHOW TABLES 명령을 사용하여 테이블의 상태를 조사합니다. 어떤 부분 변경 사항이 적용되었는지 확인합니다(있는 경우).

      • 부분적인 변경이 적용된 경우 적절한 ALTER TABLE 문을 실행하여 테이블을 원래 상태로 되돌립니다.

        참고

        일부 경우에는 일부 변경 사항을 실행 취소할 수 없을 수도 있습니다. 자세한 내용은 ALTER TABLE … ALTER COLUMN 항목에서 열 속성 수정 시 지원되는 작업 및 지원되지 않는 작업을 참조하십시오.

    • 부분 업데이트에서 복구하는 데 도움이 필요한 경우 Snowflake 지원 으로 문의하십시오.

기본 예제

현재 데이터베이스에 간단한 테이블을 만들고 테이블에 행 삽입하기:

CREATE TABLE mytable (amount NUMBER);

+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+

INSERT INTO mytable VALUES(1);

SHOW TABLES like 'mytable';

+---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:32:28 -0700 | MYTABLE | TESTDB        | PUBLIC      | TABLE |         |            |    1 |  1024 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

DESC TABLE mytable;

+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name   | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

간단한 테이블을 만들고 테이블과 테이블의 열 모두에 대한 설명 지정하기:

CREATE TABLE example (col1 NUMBER COMMENT 'a column comment') COMMENT='a table comment';

+-------------------------------------+
| status                              |
|-------------------------------------|
| Table EXAMPLE successfully created. |
+-------------------------------------+

SHOW TABLES LIKE 'example';

+---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment         | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:35:59 -0700 | EXAMPLE | TESTDB        | PUBLIC      | TABLE | a table comment |            |    0 |     0 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------+

DESC TABLE example;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment          |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------|
| COL1 | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | a column comment |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
Copy

CTAS 예

기존 테이블에서 선택하여 테이블 만들기:

CREATE TABLE mytable_copy (b) AS SELECT * FROM mytable;

DESC TABLE mytable_copy;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| B    | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

CREATE TABLE mytable_copy2 AS SELECT b+1 AS c FROM mytable_copy;

DESC TABLE mytable_copy2;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| C    | NUMBER(39,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

SELECT * FROM mytable_copy2;

+---+
| C |
|---|
| 2 |
+---+
Copy

기존 테이블에서 선택하여 테이블을 만드는 더 높은 수준의 예로, 이 예에서는 새 테이블의 summary_amount 열에 있는 값이 원본 테이블의 두 열에서 파생됩니다.

CREATE TABLE testtable_summary (name, summary_amount) AS SELECT name, amount1 + amount2 FROM testtable;
Copy

스테이지 상태 Parquet 데이터 파일에서 열을 선택하여 테이블 만들기:

CREATE OR REPLACE TABLE parquet_col (
  custKey NUMBER DEFAULT NULL,
  orderDate DATE DEFAULT NULL,
  orderStatus VARCHAR(100) DEFAULT NULL,
  price VARCHAR(255)
)
AS SELECT
  $1:o_custkey::number,
  $1:o_orderdate::date,
  $1:o_orderstatus::text,
  $1:o_totalprice::text
FROM @my_stage;

+-----------------------------------------+
| status                                  |
|-----------------------------------------|
| Table PARQUET_COL successfully created. |
+-----------------------------------------+

DESC TABLE parquet_col;

+-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name        | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| CUSTKEY     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| ORDERDATE   | DATE         | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| ORDERSTATUS | VARCHAR(100) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| PRICE       | VARCHAR(255) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

CREATE TABLE … LIKE 예제

다른 테이블과 열 정의가 같지만 행이 없는 테이블 만들기:

CREATE TABLE mytable (amount NUMBER);

INSERT INTO mytable VALUES(1);

SELECT * FROM mytable;

+--------+
| AMOUNT |
|--------|
|      1 |
+--------+

CREATE TABLE mytable_2 LIKE mytable;

DESC TABLE mytable_2;

+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name   | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

SELECT * FROM mytable_2;

+--------+
| AMOUNT |
|--------|
+--------+
Copy

매개 변수와 속성을 설정하는 CREATE TABLE의 예

다중 열 클러스터링 키로 테이블 만들기:

CREATE TABLE mytable (date TIMESTAMP_NTZ, id NUMBER, content VARIANT) CLUSTER BY (date, id);

SHOW TABLES LIKE 'mytable';

+---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment | cluster_by       | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:20:41 -0700 | MYTABLE | TESTDB        | PUBLIC      | TABLE |         | LINEAR(DATE, ID) |    0 |     0 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
Copy

테이블의 열에 대한 데이터 정렬 지정하기:

CREATE OR REPLACE TABLE collation_demo (
  uncollated_phrase VARCHAR, 
  utf8_phrase VARCHAR COLLATE 'utf8',
  english_phrase VARCHAR COLLATE 'en',
  spanish_phrase VARCHAR COLLATE 'es');

INSERT INTO collation_demo (
      uncollated_phrase, 
      utf8_phrase, 
      english_phrase, 
      spanish_phrase) 
   VALUES (
     'pinata', 
     'pinata', 
     'pinata', 
     'piñata');
Copy

CREATE TABLE … USING TEMPLATE 예제

Avro, Parquet 또는 ORC 데이터를 포함하는 스테이징된 파일 세트에서 열 정의가 파생되는 테이블을 만듭니다.

문에서 참조하는 mystage 스테이지와 my_parquet_format 파일 형식이 이미 있어야 합니다. 스테이지 정의에서 참조하는 클라우드 저장소 위치에 파일 세트가 이미 스테이징되어 있어야 합니다.

다음 예제에서는 스테이징된 파일에서 감지된 스키마를 사용하여 테이블을 만들고 order_id 를 기준으로 열을 정렬합니다. 이 예제는 INFER_SCHEMA 항목의 예제를 기반으로 합니다.

CREATE TABLE mytable
  USING TEMPLATE (
    SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
    WITHIN GROUP (ORDER BY order_id)
      FROM TABLE(
        INFER_SCHEMA(
          LOCATION=>'@mystage',
          FILE_FORMAT=>'my_parquet_format'
        )
      ));
Copy

order_id 를 기준으로 한 열 정렬은 모든 스테이징된 파일이 단일 스키마를 공유하는 경우에만 적용됩니다. 스테이징된 데이터 파일 세트에 공유 열 이름이 있는 여러 스키마가 포함된 경우 order_id 열에 표시된 순서가 어떤 단일 파일과도 일치하지 않을 수 있습니다.

참고

ARRAY_AGG(OBJECT_CONSTRUCT()) 에 대해 * 를 사용하면 반환된 결과가 16MB보다 클 경우 오류가 발생할 수 있습니다. 더 큰 결과 세트에는 * 를 사용하지 말고 쿼리에 필수적인 열인 COLUMN NAME, TYPE, NULLABLE 만 사용하는 것이 좋습니다. WITHIN GROUP (ORDER BY order_id) 를 사용할 때 선택적 열 ORDER_ID 를 포함할 수 있습니다.

임시 테이블 예제

세션이 끝날 때 자동으로 삭제되는 임시 테이블을 만듭니다.

CREATE TEMPORARY TABLE demo_temporary (i INTEGER);
CREATE TEMP TABLE demo_temp (i INTEGER);
Copy

다른 벤더와의 호환성을 위해, Snowflake는 아래 키워드를 TEMPORARY의 동의어로 사용하는 것도 지원합니다.

CREATE LOCAL TEMPORARY TABLE demo_local_temporary (i INTEGER);
CREATE LOCAL TEMP TABLE demo_local_temp (i INTEGER);

CREATE GLOBAL TEMPORARY TABLE demo_global_temporary (i INTEGER);
CREATE GLOBAL TEMP TABLE demo_global_temp (i INTEGER);

CREATE VOLATILE TABLE demo_volatile (i INTEGER);
Copy

CREATE OR ALTER TABLE 예제

CREATE OR ALTER TABLE 명령을 사용하여 my_table 테이블을 생성합니다.

CREATE OR ALTER TABLE my_table(a INT);
Copy

참고

기존 테이블에 대한 CREATE OR ALTER TABLE 문은 테이블 my_table 에 대한 OWNERSHIP 권한이 있는 역할만 실행할 수 있습니다.

테이블 my_table 를 변경하여 열을 추가 및 수정하고 DATA_RETENTION_TIME_IN_DAYS 및 DEFAULT_DDL_COLLATION 매개 변수를 설정합니다.

CREATE OR ALTER TABLE my_table(
    a INT PRIMARY KEY,
    b VARCHAR(200)
  )
  DATA_RETENTION_TIME_IN_DAYS = 5
  DEFAULT_DDL_COLLATION = 'de';
Copy

DATA_RETENTION_TIME_IN_DAYS 매개 변수를 설정 해제합니다. 수정된 테이블 정의에 매개 변수가 없으면 해당 테이블 정의가 설정 해제됩니다. 이 경우 테이블의 1 매개 변수를 설정 해제하면 기본값인 DATA_RETENTION_TIME_IN_DAYS로 재설정됩니다.

CREATE OR ALTER TABLE my_table(
    a INT PRIMARY KEY,
    c VARCHAR(200)
  )
  DEFAULT_DDL_COLLATION = 'de';
Copy

CREATE OR ALTER TABLE 명령은 열 목록의 끝에 열을 추가하는 기능을 지원합니다. 기존 열의 이름 바꾸기를 시도하면 기존 열이 삭제되고 새 열 이름이 지정된 새 열이 추가됩니다. 원래 열에 데이터가 있는 경우 데이터가 손실될 수 있습니다.

다음 예제는 이러한 동작을 보여줍니다.

  1. 테이블을 만듭니다.

    CREATE OR ALTER TABLE my_table(
        a INT PRIMARY KEY,
        b INT
      );
    
    Copy
  2. my_table 테이블에 데이터를 삽입합니다.

    INSERT INTO my_table VALUES (1, 2), (2, 3);
    
    SELECT * FROM my_table;
    
    Copy

    반환 결과:

    +---+---+
    | A | B |
    |---+---|
    | 1 | 2 |
    | 2 | 3 |
    +---+---+
    
  3. b 열 이름 바꾸기를 시도합니다.

    CREATE OR ALTER TABLE my_table(
        a INT PRIMARY KEY,
        c INT
      );
    
    Copy

    b 열이 삭제되고 c 열이 추가됩니다.

    SELECT * FROM my_table;
    
    Copy

    반환 결과:

    +---+------+
    | A | C    |
    |---+------|
    | 1 | NULL |
    | 2 | NULL |
    +---+------+
    

    참고

    삭제된 열은 Time Travel 을 사용하여 복구할 수 있습니다.

인라인 기본 키를 설정하거나 설정 해제하면 CREATE TABLE 명령의 동작과 일치하는 방식으로 열의 null 허용 여부가 변경되지만 ALTER TABLE 명령의 동작과는 다릅니다. 예를 들어, ALTER TABLE 문을 사용하여 열에 기본 키 제약 조건을 추가해도 열 null 허용 여부는 변경되지 않습니다.

다음 예제는 이러한 동작을 보여줍니다.

  1. 테이블을 만듭니다.

    CREATE TABLE t(a INT);
    
    Copy
  2. 테이블을 변경하여 PRIMARY KEY 제약 조건을 추가합니다.

    CREATE OR ALTER TABLE t(a INT PRIMARY KEY);
    
    Copy

    이제 a 열이 기본 키가 되며 NOT NULL로 설정됩니다.

    DESC TABLE t;
    
    Copy

    반환 결과:

    +------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    | name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
    |------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
    | A    | NUMBER(38,0) | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
    +------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    
  3. t 테이블을 바꿉니다.

    CREATE OR REPLACE TABLE t(a INT);
    
    Copy
  4. NULL 값을 삽입합니다.

    INSERT INTO t VALUES (null);
    
    Copy
  5. a 에 기본 키 제약 조건을 추가합니다.

    a 의 NULL 값으로 인해 다음 문이 실패합니다.

    CREATE OR ALTER TABLE t(a INT PRIMARY KEY);
    
    Copy

    반환 결과:

    001471 (42601): SQL compilation error:
    Column 'A' contains null values. Not null constraint cannot be added.