CREATE TABLE AS
Определяет новую таблицу на основе результатов запроса.
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE <table_name>
[ (<column_name> [, ...] ) ]
[ WITH ( <storage_parameter> [= <value>] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <tablespace_name> ]
AS <query>
[ WITH [ NO ] DATA ]
[ DISTRIBUTED BY (<column> [, ... ] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
где storage_parameter может принимать следующие значения:
appendoptimized={TRUE|FALSE}
blocksize={8192-2097152}
orientation={COLUMN|ROW}
compresstype={ZLIB|ZSTD|RLE_TYPE|NONE}
compresslevel={1-19}
fillfactor={10-100}
[oids=FALSE]
Описание
CREATE TABLE AS создает таблицу и заполняет ее данными, полученными в результате выполнения команды SELECT.
Столбцы таблицы получают имена и типы данных, ассоциированные с выходными столбцами SELECT, однако имена столбцов можно переопределить, указав явный список новых имен.
CREATE TABLE AS создает новую таблицу и вычисляет запрос только один раз для первоначального заполнения таблицы.
Новая таблица не будет отслеживать последующие изменения в исходных таблицах запроса.
Параметры
| Параметр | Описание |
|---|---|
GLOBAL | LOCAL |
Игнорируется для обеспечения совместимости. Эти ключевые слова являются устаревшими; подробнее см. CREATE TABLE |
TEMPORARY | TEMP |
Если указано, новая таблица создается как временная.
Временные таблицы автоматически удаляются по завершении сеанса или, по выбору, по завершении текущей транзакции (см. |
UNLOGGED |
Если указано, таблица создается как нежурналируемая (unlogged). Данные, записываемые в нежурналируемые таблицы, не записываются в журнал предзаписи (WAL), что делает их значительно быстрее обычных таблиц. Однако содержимое нежурналируемой таблицы не реплицируется на зеркальные экземпляры сегментов. Кроме того, нежурналируемые таблицы не являются устойчивыми к сбоям. После сбоя или некорректного завершения работы экземпляра сегмента данные нежурналируемой таблицы на этом сегменте усекаются. Любые индексы, созданные на нежурналируемой таблице, также автоматически являются нежурналируемыми |
table_name |
Имя (опционально указанное со схемой) создаваемой таблицы |
column_name |
Имя столбца в новой таблице. Если имена столбцов не указаны, они берутся из имен выходных столбцов запроса |
WITH ( <storage_parameter>=<value> ) |
Выражение
|
ON COMMIT |
Поведение временных таблиц по завершении блока транзакций можно контролировать с помощью
|
TABLESPACE <tablespace_name> |
Параметр |
AS query |
Команда |
DISTRIBUTED BY ({<column> [<opclass>]}, [ … ] ) DISTRIBUTED RANDOMLY DISTRIBUTED REPLICATED |
Используется для объявления политики распределения Greengage DB для таблицы.
Серверный параметр конфигурации Greengage DB
|
Примечания
Эта команда функционально аналогична SELECT INTO, однако предпочтительнее, поскольку ее реже путают с другими вариантами использования синтаксиса SELECT INTO.
Кроме того, CREATE TABLE AS предоставляет расширенный набор функциональности по сравнению с SELECT INTO.
CREATE TABLE AS можно использовать для быстрой загрузки данных из источников внешних таблиц.
См. CREATE EXTERNAL TABLE.
Примеры
Создать новую таблицу films_recent, содержащую только недавние записи из таблицы films:
CREATE TABLE films_recent AS
SELECT *
FROM films
WHERE date_prod >= '2025-01-01';
Создать новую временную таблицу 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
(
'2025-01-01'
);
Совместимость
CREATE TABLE AS соответствует стандарту SQL со следующими исключениями:
-
Стандарт требует круглых скобок вокруг подзапроса; в Greengage DB эти скобки являются необязательными.
-
В стандарте выражение
WITH [NO] DATAобязательно; в Greengage DB его использование необязательно. -
Greengage DB обрабатывает временные таблицы иначе, чем определено в стандарте; подробнее см. CREATE TABLE.
-
Выражение
WITHявляется расширением Greengage DB; ни параметры хранения, ниOIDsне входят в стандарт. Синтаксис создания системных столбцов OID является устаревшим. -
Концепция табличных пространств в Greengage DB не является частью стандарта. Выражение
TABLESPACEявляется расширением.