CREATE TABLE AS#

CREATE TABLE AS

CREATE TABLE AS

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 or LOCAL

Игнорируется для совместимости. Использование этих ключевых слов устарело; см. CREATE TABLE для получения подробной информации.

TEMPORARY or TEMP

Если указано, таблица создается как временная таблица. Подробности см. в разделе CREATE TABLE.

UNLOGGED

Если указано, таблица создается как незарегистрированная таблица. Подробности см. в разделе CREATE TABLE.

IF NOT EXISTS

Не генерировать ошибку, если отношение с таким же именем уже существует; просто выдать уведомление и оставить таблицу неизменной.

table_name

Имя (опционально с указанием схемы) создаваемой таблицы.

column_name

Имя столбца в новой таблице. Если имена столбцов не указаны, они берутся из имен выходных столбцов запроса.

USING method

Этот необязательный параметр указывает метод доступа к таблице, который будет использоваться для хранения содержимого новой таблицы; метод должен быть методом доступа типа TABLE. См. Глава 61 для получения дополнительной информации. Если этот параметр не указан, для новой таблицы выбирается метод доступа по умолчанию. См. default_table_access_method для получения дополнительной информации.

WITH ( storage_parameter [= value] [, ... ] )

Это предложение определяет необязательные параметры хранения для новой таблицы; см. Storage Parameters в документации CREATE TABLE для получения дополнительной информации. Для обеспечения обратной совместимости, в предложении WITH для таблицы также может присутствовать OIDS=FALSE, чтобы указать, что строки новой таблицы не должны содержать OID (идентификаторы объектов), OIDS=TRUE больше не поддерживается.

WITHOUT OIDS

Это обратно совместимый синтаксис для объявления таблицы WITHOUT OIDS, создание таблицы WITH OIDS больше не поддерживается.

ON COMMIT

Поведение временных таблиц в конце блока транзакции можно контролировать с помощью ON COMMIT. Три варианта:

PRESERVE ROWS

Не выполняется никаких специальных действий в конце транзакций. Это является поведением по умолчанию.

DELETE ROWS

Все строки во временной таблице будут удалены в конце каждого блока транзакции. По сути, автоматически выполняется TRUNCATE при каждом коммите.

DROP

Временная таблица будет удалена в конце текущего блока транзакции.

TABLESPACE tablespace_name

tablespace_name - это имя табличного пространства, в котором будет создана новая таблица. Если не указано, будет использовано значение default_tablespace, или temp_tablespaces, если таблица временная.

query

A SELECT, TABLE, or VALUES command, or an EXECUTE command that runs a prepared SELECT, TABLE, or VALUES query.

WITH [ NO ] DATA

Эта фраза определяет, должны ли данные, полученные из запроса, быть скопированы в новую таблицу. Если нет, то копируется только структура таблицы. По умолчанию данные копируются.

Примечания

Эта команда функционально аналогична SELECT INTO, но предпочтительна, так как меньше всего вероятности путаницы с другими использованиями синтаксиса 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. Следующие расширения являются нестандартными:

  • Стандарт требует наличия скобок вокруг подзапроса; в Tantor SE эти скобки являются необязательными.

  • В стандарте требуется использование WITH [ NO ] DATA в PostgreSQL, но в PostgreSQL это необязательно.

  • Tantor SE обрабатывает временные таблицы весьма отличным от стандартного способом; см. CREATE TABLE для получения подробной информации.

  • Предложение WITH является расширением Tantor SE; параметры хранения не являются стандартными.

  • Концепция таблиц в Tantor SE не является частью стандарта. Поэтому, ключевое слово TABLESPACE является расширением.