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