View a markdown version of this page

CREATE TABLE - Amazon Aurora DSQL

CREATE TABLE

CREATE TABLE은 새 테이블을 정의합니다.

지원되는 구문

CREATE TABLE [ IF NOT EXISTS ] table_name ( [ { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option ... ] } [, ... ] ] ) where column_constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and table_constraint is: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and referential_action in a FOREIGN KEY/REFERENCES constraint is: { NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] } and like_option is: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | ALL } index_parameters in UNIQUE and PRIMARY KEY constraints are: [ INCLUDE ( column_name [, ... ] ) ]

ID 열

참고

ID 열을 사용할 때는 캐시 값을 신중하게 고려해야 합니다. 자세한 내용은 CREATE SEQUENCE 페이지의 중요 안내를 참조하세요.

워크로드 패턴을 기반으로 ID 열을 가장 잘 사용하는 방법에 대한 지침은 시퀀스 및 자격 증명 열 작업 섹션을 참조하세요.

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) 절은 열을 ID 열로 만듭니다. 암시적 시퀀스가 연결되고 새로 삽입된 행에서 열은 할당된 시퀀스의 값을 자동으로 갖습니다. 이러한 열은 암시적으로 NOT NULL입니다.

ALWAYS 및 BY DEFAULT 절은 INSERT 및 UPDATE 명령에서 사용자 지정 값을 명시적으로 처리하는 방법을 결정합니다.

INSERT 명령에서 ALWAYS가 선택된 경우 INSERT 문이 OVERRIDING SYSTEM VALUE를 지정하는 경우에만 사용자 지정 값이 허용됩니다. BY DEFAULT를 선택하면 사용자 지정 값이 우선합니다.

UPDATE 명령에서 ALWAYS가 선택된 경우 열을 이외의 값으로 업데이트하면 DEFAULT가 거부됩니다. BY DEFAULT를 선택하면 열을 정상적으로 업데이트할 수 있습니다. (UPDATE명령에는 OVERRIDING 절이 없습니다.)

sequence_options 절을 사용하여 시퀀스의 파라미터를 재정의할 수 있습니다. 사용 가능한 옵션에는 CREATE SEQUENCE에 대해 표시된 옵션과 SEQUENCE NAME name이 포함됩니다. SEQUENCE NAME이 없으면 시스템에서 시퀀스에 사용되지 않는 이름을 선택합니다.

스토리지 모드

선택적 STORAGE 절은 열의 스토리지 모드를 설정합니다. 이러한 옵션을 사용하여 JSON, JSONB, TEXT, VARCHAR 및 BPCHAR와 같은 가변 길이 데이터 형식의 압축 동작을 제어합니다.

Amazon Aurora DSQL은 특정 크기를 초과할 때 일부 데이터 형식을 압축합니다. 이 동작을 비활성화하려면 PLAIN 또는 EXTERNAL 옵션을 사용합니다.

PLAIN

Aurora DSQL은 압축 없이 데이터를 인라인으로 저장합니다. 이는 integer와 같은 고정 길이 데이터 유형에 대한 유일한 옵션입니다. 일부 가변 길이 유형에서 압축을 비활성화하려면 이 옵션을 사용합니다.

MAIN | EXTENDED | DEFAULT

MAIN 및 EXTENDED는 기본 데이터 형식이 압축을 지원하는 경우 열의 선택적 압축을 허용합니다. DEFAULT는 스토리지 모드를 열의 데이터 형식에 대한 기본 모드로 설정합니다.

EXTERNAL

Aurora DSQL은 현재 TOAST 테이블을 지원하지 않지만 EXTERNAL은 압축을 지원하는 데이터 형식에서 압축을 비활성화합니다.

외래 키 제약 조건

REFERENCES 및 FOREIGN KEY 절은 외래 키 제약 조건을 지정합니다. 이 제약 조건은 새 테이블의 하나 이상의 열로 구성된 그룹에 포함된 값이 참조되는 테이블의 특정 행에 있는 참조 대상 열의 값과 일치하도록 요구합니다. refcolumn 목록을 생략하면 Aurora DSQL은 reftable의 프라이머리 키를 사용합니다. 그렇지 않으면 refcolumn 목록은 지연 불가능한 고유 또는 프라이머리 키 제약 조건의 열을 참조해야 합니다.

Aurora DSQL은 지정된 일치 유형을 사용하여 참조 열에 삽입된 값을 참조 대상 테이블 및 참조 대상 열의 값과 대조합니다. 지원되는 일치 유형은 MATCH FULL 및 MATCH SIMPLE(기본값)입니다.

외래 키를 열 제약 조건 또는 테이블 제약 조건으로 정의할 수 있습니다.

  • 열 제약 조건(REFERENCES) – 단일 열 외래 키의 열 데이터 유형 뒤에 REFERENCES를 사용합니다.

  • 테이블 제약 조건(FOREIGN KEY) – 단일 열 또는 다중 열 외래 키에 FOREIGN KEY (...) REFERENCES ...를 사용합니다.

참조 작업

참조된 열의 데이터를 변경하면 Aurora DSQL은 참조 테이블의 열에 있는 데이터에 대한 작업을 수행합니다. ON DELETE 절은 트랜잭션이 참조된 테이블에서 참조된 행을 삭제할 때 수행할 작업을 지정합니다. 마찬가지로 ON UPDATE 절은 트랜잭션이 참조된 열을 새 값으로 업데이트할 때 수행할 작업을 지정합니다. 트랜잭션이 행을 업데이트하지만 참조된 열을 변경하지 않는 경우 Aurora DSQL은 아무 작업도 수행하지 않습니다.

Aurora DSQL은 다음과 같은 참조 작업을 지원합니다.

NO ACTION(기본값)

삭제 또는 업데이트로 인해 외래 키 제약 조건 위반이 발생하는 경우 오류가 발생합니다. 제약 조건이 지연된 경우, Aurora DSQL은 제약 조건 검사 시점에 참조하는 행이 여전히 존재하면 이 오류를 발생시킵니다. 이는 기본 작업입니다.

RESTRICT

삭제하거나 업데이트하려는 행이 참조 테이블의 행과 일치할 경우 오류를 발생시킵니다. 이렇게 하면 해당 작업 이후의 상태가 외래 키 제약 조건을 위반하지 않는 경우라도 해당 작업이 차단됩니다. 특히 서로 다르지만 비교 시에는 동일한 것으로 간주되는 값으로 참조 대상 행이 업데이트되는 것을 방지합니다. NO ACTION과 달리 RESTRICT 검사는 연기할 수 없습니다.

계단식 작업은 트랜잭션 수정 한도에 포함됩니다.

CASCADE, SET NULL 및 SET DEFAULT 작업은 참조 대상 행이 업데이트되거나 삭제될 때 참조 테이블의 행을 자동으로 수정합니다. Aurora DSQL 트랜잭션 행 제한은 이러한 작업에 적용되며 신중하게 사용하지 않으면 예기치 않은 오류가 발생할 수 있습니다. 하위 행 카디널리티가 제한되지 않거나 예측할 수 없는 외래 키 관계의 경우 NO ACTION 또는 RESTRICT를 선호합니다. 자세한 내용은 Aurora DSQL의 데이터베이스 한도 섹션을 참조하세요.

CASCADE

삭제된 행을 참조하는 행을 삭제하거나 참조 열의 값을 참조 대상 열의 새 값으로 각각 업데이트합니다.

SET NULL [ ( column_name [, ... ] ) ]

모든 참조 열 또는 참조 열의 지정된 하위 집합을 null로 설정합니다. 열의 하위 집합은 ON DELETE 작업에 대해서만 지정할 수 있습니다.

SET DEFAULT [ ( column_name [, ... ] ) ]

모든 참조 열 또는 참조 열의 지정된 하위 집합을 기본값으로 설정합니다. 열의 하위 집합은 ON DELETE 작업에 대해서만 지정할 수 있습니다. (기본값이 null이 아닌 경우 기본값과 일치하는 행이 참조 테이블에 있어야 합니다. 그렇지 않으면 작업이 실패합니다.)

일치 유형

Aurora DSQL은 다음과 같은 일치 유형을 지원합니다.

MATCH SIMPLE(기본값)

모든 외래 키 열이 null이 되도록 허용합니다. 이 중 하나라도 Null이면 행이 참조 대상 테이블에 일치하는 항목이 없어도 됩니다.

MATCH FULL

다중 열 외래 키의 경우, 모든 외래 키 열이 Null인 경우가 아니라면 특정 열 하나만 Null로 설정하는 것을 허용하지 않습니다. 모두 Null이면 행이 참조 대상 테이블에 일치하는 항목이 없어도 됩니다.

참조 열에 NOT NULL 제약 조건을 적용하여 이러한 사례가 발생하지 않도록 할 수 있습니다.

지연 가능성

외래 키 제약 조건의 지연 가능성을 지정하여 제약 조건 검사 시점을 제어할 수 있습니다.

NOT DEFERRABLE(기본값)

Aurora DSQL은 각 문이 실행된 직후에 이 제약 조건을 확인합니다. SET CONSTRAINTS로는 지연되도록 변경할 수 없습니다.

DEFERRABLE

제약 조건은 SET CONSTRAINTS를 사용하여 트랜잭션의 끝으로 지연할 수 있습니다. INITIALLY 절이 없으면 기본값은 INITIALLY IMMEDIATE입니다.

DEFERRABLE INITIALLY IMMEDIATE

기본적으로 Aurora DSQL은 각 문이 실행된 후 이 제약 조건을 검사하지만 SET CONSTRAINTS ... DEFERRED를 사용하여 트랜잭션 내에서 이 제약 조건을 지연할 수 있습니다.

DEFERRABLE INITIALLY DEFERRED

기본적으로 Aurora DSQL은 트랜잭션 커밋 시 이 제약 조건을 확인합니다. SET CONSTRAINTS ... IMMEDIATE를 사용하여 트랜잭션 내에서 즉시로 변경할 수 있습니다.

트랜잭션 내에서 제약 조건 검사 시점을 변경하는 방법에 대한 자세한 내용은 SET CONSTRAINTS 섹션을 참조하세요.

외래 키 제약 조건만 해당

Aurora DSQL에서 DEFERRABLE 옵션은 외래 키 제약 조건에만 적용됩니다.

외래 키 제약 조건 예제

제품을 저장하는 테이블이 있다고 가정합니다.

CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric );

이제 해당 제품의 주문을 저장하는 테이블이 필요합니다. 주문 테이블에 실제로 존재하는 제품에 대한 참조가 포함되어 있는지 확인하려고 합니다. 주문 테이블에서 제품 테이블을 참조하는 외래 키 제약 조건을 정의합니다.

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products (product_no), quantity integer );

이제 제품 테이블에 표시되지 않는 Null이 아닌 product_no 항목이 있는 주문을 생성할 수 없습니다.

이 경우 주문 테이블은 참조하는 테이블이고 제품 테이블은 참조되는 테이블입니다. 마찬가지로 참조하는 열과 참조되는 열도 있습니다.

위의 명령을 다음과 같이 줄일 수 있습니다.

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products, quantity integer );

열 목록을 생략하면 Aurora DSQL은 참조되는 테이블의 프라이머리 키를 참조되는 열로 사용합니다.

일반적인 방법으로 외래 키 제약 조건에 고유한 이름을 할당할 수 있습니다.

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer CONSTRAINT fk_product REFERENCES products, quantity integer );

외래 키는 열 그룹을 제약하고 참조할 수도 있습니다. 그런 다음 테이블 제약 조건 형식으로 작성해야 합니다.

CREATE TABLE inventory ( warehouse_id integer, product_no integer, quantity integer, PRIMARY KEY (warehouse_id, product_no) ); CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) );

제한된 열의 수 및 유형은 참조된 열의 수 및 유형과 호환되어야 합니다.

테이블에는 두 개 이상의 외래 키 제약 조건이 있을 수 있습니다. 이는 테이블 간에 다대다 관계를 구현하는 데 사용됩니다.

CREATE TABLE order_items ( product_no integer REFERENCES products, order_id integer REFERENCES orders, quantity integer, PRIMARY KEY (product_no, order_id) );

외래 키 제약 조건은 자신이 속한 동일한 테이블을 참조할 수 있습니다. 이를 자기 참조 외래 키라고 합니다. 예를 들어 테이블의 행이 트리 구조의 노드를 나타내도록 하려면 다음을 작성할 수 있습니다.

CREATE TABLE tree ( node_id integer PRIMARY KEY, parent_id integer REFERENCES tree, name text );

최상위 노드에는 Null parent_id가 있는 반면, Null이 아닌 parent_id 항목은 테이블의 유효한 행을 참조하도록 제한됩니다.

참조 작업을 지정하여 참조된 행이 삭제되거나 업데이트될 때 발생하는 상황을 제어할 수 있습니다. 다음 예제에서는 ON DELETE RESTRICT를 사용하여 주문에서 여전히 참조하는 제품의 삭제를 방지합니다.

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products ON DELETE RESTRICT, quantity integer );

RESTRICT에서 주문이 참조하는 제품을 삭제하려고 하면 즉시 오류가 발생합니다. 기본 NO ACTION을 사용할 경우 제약 조건이 DEFERRABLE로 선언되어 있다면 검사를 트랜잭션의 끝으로 지연할 수 있습니다.

트랜잭션의 끝으로 지연시킬 수 있는 외래 키를 생성하려면 DEFERRABLE 옵션을 사용합니다. 이는 순서에 관계없이 동일한 트랜잭션 내의 두 테이블에 행을 삽입해야 할 때 유용합니다.

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products DEFERRABLE INITIALLY DEFERRED, quantity integer );

DEFERRABLE INITIALLY DEFERRED를 사용하면 커밋 시간까지 제약 조건이 검사되지 않습니다. 트랜잭션이 커밋되는 시점에만 제품 행이 존재한다면, 제품 행이 생성되기 전이라도 주문 행을 삽입할 수 있습니다.

참조하는 모든 열이 모두 Null이거나 모두 Null이 아닐 것을 요구하는 복합 외래 키와 함께 MATCH FULL를 사용하려면:

CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) MATCH FULL );