CREATE TABLE AS — 쿼리 결과로 새 테이블 정의
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]테이블이름
[ (칼럼이름
[, ...] ) ] [ USINGmethod
] [ 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
옵션도 확장 기능이다.