CREATE TABLE

CREATE TABLE

CREATE TABLE 명령은 현재/지정된 스키마에 새 테이블을 만들거나, 기존 테이블을 교체하거나, 기존 테이블을 변경하는 명령이에요. 테이블은 여러 컬럼을 가질 수 있으며, 각 컬럼 정의는 이름, 데이터 유형, 선택적으로 컬럼 속성들로 구성됩니다.

출처: CREATE TABLE

본문

현재/지정된 스키마에 새 테이블을 만들거나, 기존 테이블을 교체하거나, 기존 테이블을 변경하는 명령입니다. 테이블은 여러 컬럼을 가질 수 있으며, 각 컬럼 정의는 이름, 데이터 유형, 선택적으로 컬럼이 다음과 같은지로 구성되요. 이 명령은 다음 변형도 지원합니다: ALTER TABLE, DROP TABLE, SHOW TABLES, DESCRIBE TABLE

Syntax

CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name>

  (
    -- Column definition
    <col_name> <col_type> [ [ GENERATED ALWAYS ] AS ( <expr> ) [ VIRTUAL ] ]
      [ 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> [ [ GENERATED ALWAYS ] AS ( <expr> ) [ VIRTUAL ] ] [ ... ] ]

    -- 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>' ]
  [ ICEBERG_DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ ERROR_LOGGING = { TRUE | FALSE } ]
  [ COPY TAGS ]
  [ 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 ] JOIN POLICY <policy_name> [ ALLOWED JOIN KEYS ( <col_name> [ , ... ] ) ] ]
  [ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
  [ ROW_TIMESTAMP = { TRUE | FALSE } ]

Where: col_name은 객체 식별자이며 Snowflake 식별자 요구 사항을 따라야 해요. col_typeNUMBERVARCHAR 같은 Snowflake 데이터 유형 중 하나입니다. AS ( expr )은 컬럼을 가상 컬럼으로 정의합니다. Snowflake는 쿼리 시간에 표현식에서 컬럼 값을 계산해요. ANSI SQL 호환성을 위해 동등한 [ GENERATED ALWAYS ] AS ( expr ) [ VIRTUAL ] 형식을 사용할 수도 있습니다. AS를 지정하면 같은 컬럼에 NOT NULLDEFAULT 절, CHECK 제약 조건을 적용할 수 없어요. 허용되는 표현식, 데이터 유형 규칙, 제한 사항의 전체 목록은 Virtual Columns 문서를 참고하세요.

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

인라인 제약 조건에 대한 추가 내용은 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> , ... ] ) ]
    | CHECK ( <expr> )
  }
  [ <constraint_properties> ]
  [ COMMENT '<string_literal>' ]

아웃-오브-라인 제약 조건에 대한 추가 내용은 CREATE | ALTER TABLE … CONSTRAINT 문서를 참고하세요.

참고 CREATE STAGE, ALTER STAGE, CREATE TABLE, ALTER TABLE 명령으로 복사 옵션을 지정하지 마세요. 복사 옵션은 COPY INTO <table> 명령으로 지정하는 것을 권장합니다.

백업에서 복원한 테이블:

CREATE TABLE <name> FROM BACKUP SET <backup_set> IDENTIFIER '<backup_id>'

Variant syntax

CREATE OR ALTER TABLE

테이블이 없으면 만들고, 있으면 테이블 정의에 따라 변경해요. CREATE OR ALTER TABLE 구문은 CREATE TABLE 문의 규칙을 따르며 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>' ]
  [ ICEBERG_DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ ERROR_LOGGING = { TRUE | FALSE } ]
  [ COMMENT = '<string_literal>' ]
  [ ROW_TIMESTAMP = { TRUE | FALSE } ]

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 ]
  [ COPY TAGS ]
  [ ... ]
  AS <query>

CTAS 문의 컬럼에 마스킹 정책을 적용할 수 있어요. 컬럼 데이터 유형 뒤에 마스킹 정책을 지정합니다. 마찬가지로 테이블에 행 접근 정책을 적용할 수 있어요. 예:

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

참고 CTAS 문에서 COPY GRANTS 절은 OR REPLACE 절과 결합될 때만 유효합니다. COPY GRANTSCREATE OR REPLACE로 교체되는 테이블(이미 존재한다면)에서 권한을 복사하며, SELECT 문에서 쿼리되는 소스 테이블에서는 복사하지 않아요. COPY GRANTS가 있는 CTAS는 기존 권한을 유지하면서 테이블을 새 데이터 집합으로 덮어쓸 수 있게 해줍니다.

CREATE TABLE … USING TEMPLATE

INFER_SCHEMA 함수를 사용해 스테이징된 파일 집합에서 파생된 컬럼 정의로 새 테이블을 만들어요. Apache Parquet, Apache Avro, ORC, JSON, CSV 파일을 지원합니다.

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

CREATE TABLE … LIKE

기존 테이블에서 데이터를 복사하지 않고 같은 컬럼 정의로 새 테이블을 만들어요. 컬럼 이름, 유형, 기본값, 제약 조건이 새 테이블로 복사됩니다.

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

참고 데이터 공유를 통해 접근되는 자동 증가 시퀀스가 있는 테이블의 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 TAGS ]
    [ ... ]

CREATE TABLE … FROM ARCHIVE OF

스토리지 수명 주기 정책이 보관한 행을 포함하는 새 테이블을 만들어요. 특정 보관 데이터를 검색하도록 필터 조건을 지정할 수 있습니다.

CREATE [ TRANSIENT ] TABLE [ IF NOT EXISTS ] <name>
  FROM ARCHIVE OF <source_table> [ [ AS ] <alias_name> ]
  WHERE <expression>

Required parameters (필수 파라미터)

  • table_name — 테이블의 식별자(이름)를 지정해요. 테이블이 생성되는 스키마 내에서 고유해야 합니다. 또한 식별자는 알파벳 문자로 시작해야 하고, 전체 식별자 문자열을 큰따옴표로 감싸지 않는 한 공백이나 특수 문자를 포함할 수 없어요 (예: "My object"). 큰따옴표로 감싼 식별자는 대소문자를 구분합니다. 자세한 내용은 Identifier requirements 문서를 참고하세요.
  • col_name — 컬럼 식별자(이름)를 지정해요. 테이블 식별자에 대한 모든 요구 사항이 컬럼 식별자에도 적용됩니다. 표준 예약 키워드 외에, 다음 키워드는 ANSI 표준 컨텍스트 함수용으로 예약되어 있어 컬럼 식별자로 사용할 수 없습니다. 예약 키워드 목록은 Reserved & limited keywords 문서를 참고하세요.
  • col_type — 컬럼의 데이터 유형을 지정해요. 테이블 컬럼에 지정할 수 있는 데이터 유형에 대한 자세한 내용은 SQL data types reference 문서를 참고하세요.
  • CTAS와 USING TEMPLATE에 필요. LIKE, CLONE, FROM ARCHIVE OF에 필요.

Backup parameters

FROM BACKUP SET 절은 백업에서 테이블을 복원해요. 다른 테이블 속성은 백업된 테이블과 모두 같으므로 지정할 필요가 없습니다.

Access control requirements (접근 제어 요구 사항)

이 작업을 실행하는 데 사용되는 역할은 최소한 다음 권한을 보유해야 해요. 기존 테이블에 대해 CREATE OR ALTER TABLE 문을 실행할 때 필요합니다. OWNERSHIP은 객체에 대한 특별한 권한으로, 객체를 생성한 역할에 자동으로 부여되지만 소유 역할(또는 MANAGE GRANTS 권한이 있는 역할)이 GRANT OWNERSHIP 명령으로 다른 역할에 이전할 수 있습니다.

Usage notes (사용 참고 사항)

테이블 관련 자세한 사용 참고 사항은 관련 문서를 참고하세요.

Examples (예제)

Basic examples

현재 데이터베이스에 간단한 테이블을 만들고 테이블에 행을 삽입해 봅시다.

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    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

간단한 테이블을 만들고 테이블과 테이블의 컬럼 모두에 주석을 지정해 봅시다.

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 |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+

CTAS examples

기존 테이블에서 선택해 테이블을 만들어 봅시다.

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 |
+---+

기존 테이블에서 선택해 테이블을 만드는 더 고급 예제예요. 이 예제에서 새 테이블의 summary_amount 컬럼의 값은 소스 테이블의 두 컬럼에서 파생됩니다.

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

스테이징된 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

더 알아보기 (Learn more)