CREATE TABLE AS

CREATE TABLE AS — 쿼리 결과로 새 테이블 정의

요약

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] 테이블이름
    [ (칼럼이름 [, ...] ) ]
    [ USING method ]
    [ WITH ( 저장_매개변수 [= ] [, ... ] ) | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE 테이블스페이스이름 ]
    AS 쿼리
    [ WITH [ NO ] DATA ]

설명

CREATE TABLE AS 명령은 SELECT 명령 결과를 새 테이블로 만든다. 만들어지는 테이블의 칼럼 이름과 자료형은 SELECT 명령 출력 칼럼을 사용한다. (물론 칼럼 이름은 새로 지정할 있다.)

CREATE TABLE AS 명령은 결과적으로 보면 뷰를 만드는 것과 비슷하지만, 내부적으로는 전혀 다른 것이다. 이 명령이 실행되면, 새 테이블이 만들어지고, 그 안에 쿼리 결과가 물리적으로 채워진다. 그래서, 원본 테이블의 자료와 별개의 자료가 된다. 반면, 뷰는 뷰를 조회할 때마다, 뷰를 만들 때 지정한 쿼리를 실행하는 형태여서, 원본 테이블의 자료가 바뀌면 뷰의 결과도 바뀐다.

매개 변수

GLOBAL 또는 LOCAL

이 옵션은 호환성 때문에 있으며, 지금은 사용하지 않는다. CREATE TABLE 참조.

TEMPORARY 또는 TEMP

이 옵션을 사용하면, 임시 테이블로 만든다. CREATE TABLE 참조.

UNLOGGED

이 옵션을 사용하면, 미리 쓰기 로그를 남기지 않는 테이블로 만든다. CREATE TABLE 참조.

IF NOT EXISTS

해당 이름의 개체가 있으면 오류로 처리하지 않고 알림 메시지만 보이고, 작업을 중지한다. CREATE TABLE 참조

테이블이름

새로 만들 테이블 이름(스키마 이름 포함).

칼럼이름

새 테이블의 칼럼 이름. 칼럼 이름을 지정하지 않으면, 쿼리 결과에서 출력된 칼럼 이름을 사용한다.

USING method

This optional clause specifies the table access method to use to store the contents for the new table; the method needs be an access method of type TABLE. See 60장 for more information. If this option is not specified, the default table access method is chosen for the new table. See default_table_access_method for more information.

WITH ( 저장_매개변수 [= ] [, ... ] )

만들 새 테이블의 저장 매개 변수를 지정한다: CREATE TABLE스토리지 매개 변수 부분에서 이 변수들을 자세히 다룬다. For backward-compatibility the WITH clause for a table can also include OIDS=FALSE to specify that rows of the new table should contain no OIDs (object identifiers), OIDS=TRUE is not supported anymore. CREATE TABLE 참조.

WITHOUT OIDS

This is backward-compatible syntax for declaring a table WITHOUT OIDS, creating a table WITH OIDS is not supported anymore.

ON COMMIT

만드는 테이블이 임시 테이블이고, 이 테이블이 트랜잭션 블럭 안에서 사용된 경우, 그 트랜잭션이 커밋 되었을 때 그 임시 테이블을 어떻게 할지를 지정한다. 세가지 옵션이 있다:

PRESERVE ROWS

특별히 다른 조작 없이 그대로 둔다.

DELETE ROWS

자료만 다 지워 빈 테이블로 만든다. 매번 커밋 될 때마다, 자동으로 TRUNCATE 명령을 수행하는 것과 같다.

DROP

트랜잭션이 커밋 되면 임시 테이블을 지운다.

TABLESPACE 테이블스페이스이름

해당 테이블이 사용하는 테이블스페이스 이름. 지정하지 않으면, 일반 테이블은 default_tablespace 테이블스페이스를 사용하며, 임시 테이블은 temp_tablespaces 테이블스페이스를 사용한다.

쿼리

SELECT, TABLE, 또는 VALUES 명령, 또는 미리 준비된 SELECT, TABLE, VALUES 명령을 실행하는 EXECUTE 명령

WITH [ NO ] DATA

테이블을 만든 뒤 그 테이블에 자료를 채울 것인지 지정한다. 채우지 않으면 빈 테이블로 만들어진다. 기본값은 자료를 채운다.

참고

이 명령은 기능적으로 SELECT INTO 명령과 비슷하지만, SELECT INTO 문법의 다른 용도와 덜 헷갈려 더 선호된다. 나아가, SELECT INTO 명령이 할 수 있는 기능보다 더 많은 기능을 제공하고 있다.

예제

films 테이블에서 최근 자료만 뽑아서 films_recent 테이블을 만들어 그곳에 따로 보관 하는 경우: (따로 보관하기 보다는 복사해 놓는다는 것이 더 맞다)

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

TABLE 명령을 이용해서 테이블 전체를 복사하는 경우:

CREATE TABLE films2 AS
  TABLE films;

미리 준비된 구문으로 자료 범위를 지정하고, EXECUTE 명령으로 실행해서, 해당 트랜잭션이 커밋 되면 자동 삭제 되는 임시 테이블을 만드는 경우:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent ON COMMIT DROP AS
  EXECUTE recentfilms('2002-01-01');

호환성

CREATE TABLE AS 구문은 SQL 표준이다. 다음은 표준이 아닌 확장 기능이다:

  • 표준에서는 서브쿼리절에는 괄호가 필요하지만, PostgreSQL에서는 괄호가 선택사항이다.

  • 표준에서는 WITH [ NO ] DATA 절이 필수지만, PostgreSQL에서는 선택 사항이다.

  • PostgreSQL에서는 임시 테이블 처리도 가능하다. CREATE TABLE 참조.

  • 저장 매개 변수를 지정하는 WITH 절은 PostgreSQL 확장 기능이다.

  • 테이블스페이스 개념도 표준이 아닌, PostgreSQL 자체 개념임으로, TABLESPACE 옵션도 확장 기능이다.

관련 항목

CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES