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.

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


Параметры

GLOBAL или LOCAL

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

TEMPORARY или TEMP

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

UNLOGGED

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

IF NOT EXISTS

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

имя_таблицы

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

имя_столбца

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

USING метод

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

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

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

  • Запрещена модификация данных (изменение и удаление).
  • Осуществляется максимально быстрая вставка данных.
  • Отсутствует необходимость в автоочистке.
  • Поддерживаются все типы индексов.
  • Для удаления старых данных можно использовать партиционированные таблицы и удалять данные партициями либо использовать команду 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