Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 



CREATE TABLE AS SELECT

설명

CREATE TABLE … AS SELECT 문을 사용하여 SELECT 문의 결과 레코드를 포함하는 새로운 테이블을 생성할 수 있다. 새로운 테이블에 대해 컬럼 및 테이블 제약 조건을 정의할 수 있으며, 다음의 규칙을 적용하여 SELECT 결과 레코드를 반영한다.

  • 새로운 테이블에 컬럼 col_1이 정의되고, select_statement에 동일한 컬럼 col_1이 명시된 경우, SELECT 결과 레코드가 새로운 테이블 col_1 값으로 저장된다. 컬럼 이름은 같고 컬럼 타입이 다르면 타입 변환을 시도한다.
  • 새로운 테이블에 컬럼 col_1, col_2가 정의되고, select_statement의 컬럼 리스트에 col_1, col_2, col_3이 명시되어 모두 포함 관계가 성립하는 경우, 새로 생성되는 테이블에는 col_1, col_2, col_3이 생성되고, SELECT 결과 데이터가 모든 컬럼 값으로 저장된다. 컬럼 이름은 같고 컬럼 타입이 다르면 타입 변환을 시도한다.
  • 새로운 테이블에 컬럼 col_1, col_2가 정의되고, select_statement의 컬럼 리스트에 col_1, col_3이 명시되어 포함 관계가 성립하지 않는 경우, 새로 생성되는 테이블에는 col_1, col_2, col_3이 생성되고, select_statement에 명시된 컬럼 col_1, col_3에 대해서만 SELECT 결과 데이터가 저장되고, col_2에는 NULL이 저장된다.
  • select_statement의 컬럼 리스트에는 컬럼 별칭(alias)이 포함될 수 있으며, 이 경우 컬럼 별칭이 새로운 테이블 컬럼 이름으로 사용된다. 함수 호출이나 표현식이 사용된 경우 별칭이 없으면 유효하지 않은 컬럼 이름이 생성되므로, 이 경우에는 별칭을 사용하는 것이 좋다.
  • REPLACE 옵션은 새로운 테이블의 컬럼(col_1)에 UNIQUE 제약 조건이 정의된 경우에만 유효하다. select_statement의 결과 레코드에 중복된 값이 존재하는 경우, REPLACE 옵션이 명시되면 컬럼 col_1에는 고유한 값이 저장되고, REPLACE 옵션이 생략되면 UNIQUE 제약 조건에 위배되므로 에러 메시지가 출력된다.
구문

CREATE {TABLE | CLASS} <table_name>

                   [( <column_definition> [,<table_constraint>]... )]

                   [REPLACE] AS <select_statement>

  • table_name : 새로 생성할 테이블 이름이다.
  • column_definition,table_constraint : 컬럼을 정의한다. 생략하면 SELECT 문의 컬럼 스키마가 복제된다. SELECT 문의 컬럼 제약 조건이나 AUTO_INCREMENT 속성은 복제되지 않는다.
  • table_constraint : 테이블 제약 조건을 정의한다.
  • select_statement : 데이터베이스에 이미 존재하는 원본 테이블을 대상으로 하는 SELECT 문이다.
예제

CREATE TABLE a_tbl(

id INT NOT NULL DEFAULT 0 PRIMARY KEY,

phone VARCHAR(10));

INSERT INTO a_tbl VALUES(1,'111-1111'), (2,'222-2222'), (3, '333-3333');

 

--creating a table without column definition

CREATE TABLE new_tbl1 AS SELECT * FROM a_tbl;

SELECT * FROM new_tbl1;

 

           id  phone

===================================

            1  '111-1111'

            2  '222-2222'

            3  '333-3333'

 

--all of column values are replicated from a_tbl

CREATE TABLE new_tbl2

(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, phone VARCHAR) AS SELECT * FROM a_tbl;

SELECT * FROM new_tbl2;

 

           id  phone

===================================

            1  '111-1111'

            2  '222-2222'

            3  '333-3333'

 

--some of column values are replicated from a_tbl and the rest is NULL

CREATE TABLE new_tbl3

(id INT, name VARCHAR) AS SELECT id, phone FROM a_tbl;

SELECT * FROM new_tbl3

 

  name                           id  phone

=========================================================

  NULL                            1  '111-1111'

  NULL                            2  '222-2222'

  NULL                            3  '333-3333'

 

--column alias in the select statement should be used in the column definition

CREATE TABLE new_tbl4

(id1 int, id2 int)AS SELECT t1.id id1, t2.id id2 FROM new_tbl1 t1, new_tbl2 t2;

SELECT * FROM new_tbl4;

 

          id1          id2

==========================

            1            1

            1            2

            1            3

            2            1

            2            2

            2            3

            3            1

            3            2

            3            3

 

--REPLACE is used on the UNIQUE column

CREATE TABLE new_tbl5(id1 int UNIQUE) REPLACE AS SELECT * FROM new_tbl4;

SELECT * FROM new_tbl5;

 

          id1          id2

==========================

            1            3

            2            3

            3            3