Перейти к основному содержимому

CREATE TABLE AS

примечание

Эта страница переведена при помощи нейросети GigaChat.

CREATE TABLE AS - создание новой таблицы из результатов запроса.

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
[ (column_name [, ...] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
AS query
[ WITH [ NO ] DATA ]

Описание

CREATE TABLE AS создает новую таблицу и заполняет ее данными, полученными в результате выполнения команды SELECT. Столбцы новой таблицы получают имена и типы данных, соответствующие выходным столбцам запроса SELECT (однако имена столбцов можно переопределить, явно указав их список).

Команда CREATE TABLE AS отчасти похожа на создание представления, но на самом деле работает иначе: она создает настоящую таблицу и выполняет запрос только один раз для первоначального наполнения этой таблицы. Новая таблица не отслеживает изменения в исходных таблицах запроса. В отличие от этого, представление пересчитывает свой определяющий запрос SELECT каждый раз при обращении.

Для использования CREATE TABLE AS требуется привилегия CREATE в схеме, где будет создана таблица.

Параметры

GLOBAL или LOCAL
Игнорируются ради совместимости. Использование этих ключевых слов устарело. Смотрите CREATE TABLE для подробностей.
TEMPORARY или TEMP
Создает таблицу как временную. Обратитесь к разделу CREATE TABLE для получения подробной информации.
UNLOGGED
Создает таблицу как незарегистрированную. Обратитесь к CREATE TABLE для получения подробной информации.
IF NOT EXISTS
Подавляет ошибку, если указанное таблица с тем же именем уже существует, вместо этого выводится уведомление и оставляет таблицу без изменений.
table_name
Имя существующей таблицы, при необходимости дополненное схемой, которая должна быть создана.
column_name
Имя столбца в новой таблице. Если имена столбцов не указаны, они берутся из имен выходных столбцов запроса.
USING method
Указывает метод доступа к таблице для хранения данных. Метод должен быть типа TABLE. Смотрите главу «Определение интерфейса метода доступа к таблицам» для получения дополнительной информации Если не указан, используется метод по умолчанию. Смотрите default_table_access_method для получения дополнительной информации. Параметр USING является опциональным.
WITH (storage_parameter [= value] [, ... ])
Указывает дополнительные параметры хранения для таблицы. Смотрите описание параметров хранения в документации CREATE TABLE. Для обратной совместимости возможно указание OIDS=FALSE, чтобы строки не содержали OID (идентификаторы объектов); OIDS=TRUE больше не поддерживается.
WITHOUT OIDS
Игнорируется - устаревший синтаксис, равнозначный OIDS=FALSE. Создание таблиц с OID больше не поддерживается.
ON COMMIT
Определяет поведение временных таблиц в конце блока транзакции. Возможны три варианта:
  • PRESERVE ROWS — данные сохраняются (поведение по умолчанию).
  • DELETE ROWS — данные автоматически удаляются в конце каждой транзакции (аналог TRUNCATE).
  • DROP — временная таблица удаляется в конце текущей транзакции.
TABLESPACE tablespace_name
Задает имя табличного пространства, в котором будет создана таблица. Если не указано, используется default_tablespace или temp_tablespaces для временных таблиц.
query
Указывает запрос вида SELECT, TABLE, VALUES или EXECUTE, возвращающий данные, которыми будет заполнена таблица.
WITH [ NO ] DATA
Определяет, нужно ли копировать данные, полученные запросом, в новую таблицу. Если указано NO DATA, копируется только структура таблицы. По умолчанию данные копируются.

Примечания

Эта команда функционально похожа на SELECT INTO, но предпочтительнее, так как ее синтаксис менее неоднозначен. Кроме того, CREATE TABLE AS поддерживает больше возможностей, чем SELECT INTO.

Примеры

Создание новой таблицы films_recent, состоящую только из последних записей из таблицы films:

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

Полное копирование таблицы (также можно использовать короткую форму команды TABLE):

CREATE TABLE films2 AS
TABLE films;

Создание новой временной таблицы films_recent, состоящей только из последних записей из таблицы films, с применением подготовленного оператора. Новая таблица прекратит существование при фиксации транзакции:

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:

  • В стандарте подзапрос должен быть заключен в скобки — в PostgreSQL это необязательно.
  • В стандарте требуется обязательное указание WITH [ NO ] DATA — в PostgreSQL это опционально.
  • PostgreSQL использует другой механизм временных таблиц по сравнению со стандартом — смотрите CREATE TABLE.
  • Выражение WITH и параметры хранения — расширения PostgreSQL.
  • Табличные пространства (TABLESPACE) — также расширение PostgreSQL.

Смотрите также

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