CREATE TABLE AS

CREATE TABLE AS — определить новую таблицу из результатов запроса

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имя_таблицы
    [ (имя_столбца [, ...] ) ]
    [ USING метод ]
    [ WITH ( параметр_хранения [= значение] [, ... ] ) | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE имя_табличного_пространства ]
    AS запрос
    [ WITH [ NO ] DATA ]

Описание

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

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

Параметры

GLOBAL или LOCAL

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

TEMPORARY или TEMP

Если этот параметр указан, таблица создается как временная таблица. Дополнительную информацию см. в разделе CREATE TABLE.

UNLOGGED

Если этот параметр указан, таблица создается как незарегистрированная таблица. Дополнительную информацию см. в разделе CREATE TABLE.

IF NOT EXISTS

Не считать ошибкой, если связь с тем же именем уже существует. В этом случае будет выдано соответствующее уведомление. Дополнительную информацию см. в разделе CREATE TABLE.

имя_таблицы

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

имя_столбца

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

USING метод

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

Если этот параметр не указан, то для новой таблицы выбирается метод доступа к таблице по умолчанию.
Дополнительную информацию см. в разделе default_table_access_method.

В QHB есть встроенный метод доступа к таблице qss, при указании которого данные таблицы, ее индексов и журнала будут записываться на диск в зашифрованном виде.
Дополнительную информацию см. в разделе Модуль безопасного хранения QSS.

Также в QHB реализован встроенный метод доступа, реализующий хранилище append_only, для которого характерны следующие свойства:

  • Запрещена модификация данных (update и delete).
  • Осуществляется максимально быстрая вставка данных.
  • Отсутствует необходимость в автоочистке.
  • Поддерживаются все типы индексов.
  • Для удаления старых данных можно использовать секционирование таблицы и удалять данные секциями, либо использовать команду TRUNCATE.
  • Не поддерживается механизм TOAST.

Дополнительную информацию см. в разделе Таблицы APPEND_ONLY.

WITH ( параметр_хранения [= значение] [, ... ] )

В этом предложении указываются необязательные параметры хранения для новой таблицы. Дополнительную информацию см. в подразделе Параметры хранения в описании команды 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 имя_табличного_пространства

имя_табличного_пространства — это имя табличного пространства, в котором будет создана новая таблица. Если этот параметр не указан, выполняется запрос default_tablespace или temp_tablespaces (если таблица временная).

запрос

Команда SELECT, TABLE или VALUES либо команда EXECUTE, которая выполняет подготовленный запрос SELECT, TABLE или VALUES.

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. Ниже приведены нестандартные расширения:

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

  • В стандарте требуется указывать предложение WITH [ NO ] DATA; в QHB это необязательно.

  • QHB обрабатывает временные таблицы не так, как указано в стандарте; подробную информацию см. в разделе CREATE TABLE.

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

  • Концепция табличных пространств QHB не является частью стандарта. Следовательно, предложение TABLESPACE является расширением.

См. также

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