CREATE TABLE

CREATE TABLE 명령을 사용하여 현재 데이터베이스에서 초기에는 비어 있는 새 테이블을 작성할 수 있습니다. CREATE TABLE 명령은 테이블의 한 행에 대응되는 튜플 유형(구조 유형)을 나타내는 데이터 유형을 자동으로 작성합니다.

테이블에는 다음이 적용됩니다.
  • 기존 데이터 유형과 동일한 이름을 보유할 수 없습니다.
  • 시스템 카탈로그 테이블과 동일한 이름을 보유할 수 없습니다.
  • 1600개를 초과하는 컬럼을 보유할 수 없습니다. 유효한 한계는 튜플 길이 제한조건 때문에 이보다 약간 낮습니다.
  • 이름이 다음과 같은 테이블 또는 뷰 속성을 보유할 수 없습니다.
    • cmax
    • cmin
    • createxid
    • ctid
    • datasliceid
    • deletexid
    • oid
    • 행 ID(rowid)
    • tableoid
    • xmax
    • xmin

선택적 제한조건 절은 삽입 또는 업데이트 조작의 성공을 위해 신규 또는 업데이트된 행이 충족해야 하는 제한조건(또는 테스트)을 지정합니다. 제한조건은 이름 지정된 규칙입니다. 즉, 테이블에서 사용되는 삽입, 업데이트 또는 삭제 조작의 결과를 제한함으로써 유효한 값 세트를 정의하는 데 도움이 되는 SQL 오브젝트입니다. Netezza Performance Server '은 제약 조건 검사를 지원하지 않으며, 제약 조건을 지정하는 경우 제약 조건 검사 및 참조 무결성을 수행해야 합니다)

다음과 같이 테이블 제한조건 및 컬럼 제한조건을 정의할 수 있습니다.
  • 컬럼 제한조건은 컬럼 정의의 일부로서 정의됩니다.
  • 테이블 제한조건 정의는 특정 컬럼에만 연관되지 않으며, 둘 이상의 컬럼에 적용될 수 있습니다.

모든 컬럼 제한조건을 테이블 제한조건으로 작성할 수도 있습니다. 해당 제한조건이 하나의 컬럼에만 영향을 주는 경우, 컬럼 제한조건은 단지 표기상의 편의 기능입니다.

분배 스펙
Netezza Performance Server RDBMS 데이터베이스의 각 테이블에는 1~4개의 열로 구성된 배포 키가 하나만 있습니다. 다음 SQL 구문을 사용하여 분배 키를 작성할 수 있습니다.
  • 명시적 배포 키를 생성하는 Netezza Performance Server SQL 구문은 다음과 같습니다:
    CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS 
    <select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]

    distribute on 구문은 분배 키를 지정하며, hash 단어는 선택사항입니다.

  • 라운드 로빈 배포 키를 생성하는 Netezza Performance Server SQL 구문은 다음과 같습니다:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
    DISTRIBUTE ON RANDOM;

    distribute on random 구문은 라운드 로빈 분배를 지정합니다.

  • 배포 키를 지정하지 않고 테이블을 만들려면 Netezza Performance Server SQL 구문은 다음과 같습니다:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int);

    Netezza Performance Server 시스템은 배포 키를 선택합니다. 해당 키가 무엇인지 확인할 수 있는 방법은 없으며 Netezza Performance Server 소프트웨어 릴리스에 따라 달라질 수 있습니다.

제한조건 규칙 조치
제한조건 업데이트 또는 삭제 시에 다음 조치를 지정할 수 있습니다. 시스템이 제한조건 검사를 실행하지 않으므로, 이 규칙은 사용되기보다는 단지 허용됩니다.
  • CASCADE는 참조 중인 컬럼의 값을 참조된 컬럼의 새 값으로 업데이트합니다.
  • SET NULL은 참조 중인 컬럼을 참조된 컬럼의 새 값으로 설정합니다.
  • SET DEFAULT는 참조된 컬럼를 설정합니다.
  • RESTRICT는 NO ACTION과 동일합니다.
  • NO ACTION은 외부 키가 위반될 때 오류를 발생합니다.
제한조건 속성
제한조건에는 제한조건 검사가 즉시 또는 지연 실행되는지 여부를 판별하는 다음 속성이 있습니다. 시스템이 제한조건 검사를 실행하지 않으므로, 이 속성은 사용되기보다는 단지 허용됩니다.
  • [NOT] DEFERRABLE은 트랜잭션 종료 시에 제한조건을 검사하는지 여부를 판별합니다.
  • INITIALLY DEFERRED는 트랜잭션 종료 시에만 제한조건을 검사합니다.
  • INITIALLY IMMEDIATE는 각 명령문 이후에 제한조건을 검사합니다.

구문

CREATE TABLE 명령의 일반 구문은 다음과 같습니다.
CREATE [ TEMPORARY | TEMP ] TABLE [IF NOT EXISTS] <table>
( <col> <type> [<col_constraint>][,<col> <type> [<col_constraint>]…]
[<table_constraint>[,<table_constraint>… ] )
[ DISTRIBUTE ON { RANDOM | [HASH] (<col>[,<col>…]) } ]
[ ORGANIZE ON { (<col>) | NONE } ]
[ ROW SECURITY ]
[ DATA_VERSION_RETENTION_TIME <number-of-days> ]
여기서 <col_constraint>는 다음을 나타냅니다.
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
여기서 <table_constraint>는 다음을 나타냅니다.
[ CONSTRAINT <constraint_name> ] 
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
여기서 <ref>는 다음을 나타냅니다.
REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]

시스템은 기본 키, 기본값, 외부 키, 고유 및 참조를 허용하고 유지보수합니다. 시스템에서 제한조건 검사 및 참조 무결성은 지원되지 않습니다. 사용자가 직접 제한조건 검사 및 참조 무결성을 확인해야 합니다.

입력

CREATE TABLE 명령의 입력은 다음과 같습니다.
표 1. CREATE TABLE 입력
입력 설명
TEMP[ORARY] 작성되는 테이블이 임시 테이블입니다.
IF NOT EXISTS 지정된 이름의 테이블이 현재 데이터베이스 및 스키마에 존재하면 테이블을 작성할 수 없으므로 CREATE TABLE 명령에서 오류를 발생하지 않습니다. 이 옵션은 일반적으로 SQL 명령을 실행 중인 스크립트 애플리케이션에 사용되며, 사용자는 스크립트 애플리케이션에 영향을 주거나 이를 정지시키지 않도록 "테이블을 찾을 수 없음" 오류 메시지를 제외하고자 합니다. 이 옵션을 포함하는 경우에는 다음 동작을 참고하십시오.
  • 기타 오류로 인해 테이블을 작성할 수 없는 경우가 아니면, 테이블이 작성되지 않아도 명령에서 CREATE TABLE 메시지를 리턴합니다. (이 옵션을 사용하면 이름이 동일한 테이블이 이미 존재하는 경우 명령이 실패를 무시합니다.)
  • 기존 테이블과 명령에 지정된 테이블을 비교하지 않습니다. 테이블의 모양이 다를 수 있습니다. 기존 테이블은 현재 모양과 행 컨텐츠가 변경되지 않은 상태로 있는 그대로 유지됩니다. 애플리케이션은 대상 테이블 및 행이 예상과 같은지 확인해야 합니다.
  • IF NOT EXISTS 구문을 AS SELECT절에서 사용할 수 없습니다. CREATE TABLE 명령의 이 양식은 오류를 발생합니다. 테이블 생성 작업을 수행하려는 경우... AS SELECT의 경우 CREATE TABLE ...을 사용하기 전에 대상 테이블이 데이터베이스 및 스키마에 존재하지 않는지 확인하기 위해 먼저 DROP TABLE IF EXISTS 명령을 호출하는 것이 좋습니다. AS SELECT 명령.
<table> 작성되는 테이블의 이름입니다.
<col> 새 테이블에서 작성되는 컬럼의 이름입니다.
<type> 컬럼의 데이터 유형입니다.
DISTRIBUTE ON 데이터베이스의 각 테이블에는 1 - 4개의 컬럼으로 구성된 분배 키가 있어야 합니다. 기본값은 RANDOM이며, 이를 사용하면 시스템이 무작위 분배 키를 선택합니다.
해시 이 매개변수는 확인을 위해 지정될 수 있지만 명령에는 영향을 주지 않습니다.
ORGANIZE ON 테이블이 구성되는 컬럼(1 - 4개)입니다. 이는 외부 테이블에는 지정될 수 없습니다. 컬럼이 지정된 경우, 테이블은 구체화된 뷰를 보유할 수 없으며 지정된 모든 컬럼 데이터 유형은 구역 맵핑이 가능해야 합니다. 테이블 데이터 재구성은 GROOM TABLE을 실행할 때 적용됩니다. 자세한 내용은 IBM® Netezza® 시스템 관리자 가이드의"클러스터된 기본 테이블 사용"을 참조하세요.
ROW SECURITY 행 레벨 보안으로 테이블을 작성합니다.
<제약 조건 이름 컬럼 제한조건 또는 테이블 제한조건에 부여되는 이름입니다. 이름을 지정하지 않으면 시스템에서 이름을 생성합니다.
NOT DEFERRABLE | DEFERRABLE 트랜잭션이 종료될 때까지 제한조건이 지연될 수 있는지 여부를 제어합니다. NOT DEFERRABLE이 기본값입니다. Netezza Performance Server 제약 조건 검사 및 참조 무결성을 지원하지 않습니다.)
INITIALLY DEFERRED(트랜잭션 종료 시에) 또는 IMMEDIATE(각 명령문 종료 시에) 중 하나를 지정합니다.
NOT NULL | NULL 컬럼에 널(NULL) 값 포함이 허용되는지 여부입니다. NULL은 기본값입니다.
UNIQUE(컬럼 및 테이블 제한조건) 컬럼의 각 값이 고유해야 하는지 여부입니다.
PRIMARY KEY(컬럼 및 테이블 제한조건) 지정된 컬럼이 테이블의 기본 키를 구성하는지 여부입니다.

이 제한조건은 기본적으로 UNIQUE 및 NOT NULL 제한조건의 조합이지만, 컬럼 세트를 기본 키로 식별하면 스키마 설계에 대한 메타데이터도 제공됩니다. 기본 키는 기타 테이블이 행에 대한 고유 ID로서 이 컬럼 세트를 필요로 할 수 있음을 의미합니다.

컬럼 제한조건 또는 테이블 제한조건으로서, 테이블에 대해 하나의 기본 키 제한조건만 지정할 수 있습니다.

기본 키를 구성하는 컬럼 세트는 테이블에 대해 정의된 임의의 고유 제한조건으로 이름 지정된 기타 컬럼 세트와는 달라야 합니다.

DEFAULT(컬럼 제한조건) 이 컬럼의 각 행에 지정되는 기본값입니다.
REFERENCES(컬럼 제한조건) 새 테이블의 지정된 컬럼은 지정된 테이블의 지정된 컬럼의 값과 일치하는 값만 포함해야 합니다.
FOREIGN KEY 및 REFERENCES 테이블(테이블 제한조건) 새 테이블의 지정된 컬럼은 지정된 테이블의 지정된 컬럼의 값과 일치하는 값만 포함해야 합니다. 컬럼을 지정하지 않은 경우, 값은 테이블의 기본 키와 일치해야 합니다. 참조된 테이블의 지정된 컬럼은 해당 테이블의 고유 또는 기본 키 제한조건을 보유해야 합니다.
MATCH FULL MATCH FULL을 사용하면 외부 키의 기타 파트가 널(NULL)이 아닌 경우 다중 컬럼 외부 키의 하나의 컬럼이 널(NULL)이 되지 않도록 방지합니다. 이는 기본값입니다. MATCH PARTIAL은 지원되지 않습니다.
ON UPDATE | ON DELETE 지정된 테이블 또는 컬럼이 갱신되거나 삭제될 때 취하는 조치입니다.
NO ACTION
외부 키가 위반되면 오류를 발생합니다. 이는 기본값입니다.
RESTRICT
NO ACTION과 동일합니다.
CASCADE
삭제된 행을 참조하는 모든 행을 삭제합니다.
SET NULL
참조 컬럼 값을 기본값으로 설정합니다.
SET DEFAULT
참조 컬럼 값을 기본값으로 설정합니다.
데이터 버전 보존 기간 <일수> 생성되는 tbl 테이블에는 지정된 DATA_VERSION_RETENTION_TIME이 있거나 지정되지 않은 경우 스키마에서 속성의 현재 값을 가져옵니다. 명시적으로 지정한 것인지 스키마에서 상속한 것인지에 관계없이 테이블의 DATA_VERSION_RETENTION_TIME이 0이면 일시적 쿼리에 테이블의 기록 데이터를 사용할 수 없습니다. 하지만 다른 이유로 삭제된 행이 유지될 수도 있습니다. 예를 들어 증분 백업이 있습니다. 테이블의 데이터 버전 보존 시간이 0이 아닌 경우, 해당 일수로 거슬러 올라가는 기록 행을 임시 쿼리에 사용할 수 있습니다.

DATA_VERSION_RETENTION_TIME 절은 CREATE TEMPORARY TABLE과 함께 사용할 수 없습니다. 모든 임시 테이블은 비시간적 테이블이며 시간 이동 쿼리를 지원하지 않습니다.

허용되는 최대 값은 92일이며, 이는 한 분기의 최대 일수입니다.

출력

이 명령의 출력은 다음과 같습니다.

테이블 2. CREATE TABLE 출력
출력 설명
CREATE TABLE 명령이 정상적으로 완료되면 시스템에서 이 메시지를 리턴합니다.
ERROR 테이블 작성에 실패하면 시스템에서 이 메시지를 리턴합니다. 오류 메시지에는 다음과 같은 설명 텍스트가 제공됩니다:ERROR: Relation 'table' already exists또는 기타 메시지. IF NOT EXISTS 구문을 지정하는 경우, 동일 이름으로 현재 데이터베이스 및 스키마에 테이블이 이미 존재할 때 시스템에서 오류를 발생하지 않습니다.

특권

관리 사용자, 데이터베이스 또는 스키마의 소유자이거나, 계정에 테이블 작성 특권이 있어야 합니다.

사용량

샘플 사용법은 다음과 같습니다.

  • 테이블을 작성하려면 다음을 수행하십시오.
       CREATE TABLE name (
           code        CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
           title       CHARACTER VARYING(40) NOT NULL,
           did         DECIMAL(3) NOT NULL,
           date_prod   DATE,
           kind        CHAR(10),
           len         INTERVAL HOUR TO MINUTE
       );
  • films 테이블에 대한 기본 키 테이블 제한조건을 정의하기 위해, 테이블의 하나 이상의 컬럼에 대해 기본 키 테이블 제한조건을 정의할 수 있습니다.
    CREATE TABLE films (
           code        CHAR(5),
           title       VARCHAR(40),
           did         DECIMAL(3),
           date_prod   DATE,
           kind        VARCHAR(10),
           len         INTERVAL HOUR TO MINUTE,
           CONSTRAINT code_title PRIMARY KEY(code,title)
       );
  • distributors 테이블에 대한 기본 키 제한조건을 정의합니다.
    CREATE TABLE distributors (
        did     DECIMAL(3),
        name    CHAR VARYING(40),
        PRIMARY KEY(did)
    ); CREATE TABLE distributors (
        did     DECIMAL(3) PRIMARY KEY,
        name    VARCHAR(40)
    );

    두 예는 동등합니다. 첫 번째 예에서는 테이블 제한조건 구문을 사용합니다. 두 번째 예에서는 컬럼 제한조건 표기법을 사용합니다.

  • distributors 테이블에 대한 두 개의 NOT NULL 컬럼 제한조건을 정의합니다(둘 중 하나는 명시적으로 이름임).
    CREATE TABLE distributors (
           did     DECIMAL(3) CONSTRAINT no_null NOT NULL,
           name    VARCHAR(40) NOT NULL
       );