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 на схему, используемую для таблицы.
Параметры
GLOBALorLOCALИгнорируется для совместимости. Использование этих ключевых слов устарело; см. CREATE TABLE для получения подробной информации.
TEMPORARYorTEMPЕсли указано, таблица создается как временная таблица. Подробности см. в разделе CREATE TABLE.
UNLOGGEDЕсли указано, таблица создается как незарегистрированная таблица. Подробности см. в разделе CREATE TABLE.
IF NOT EXISTSНе генерировать ошибку, если отношение с таким же именем уже существует; просто выдать уведомление и оставить таблицу неизменной.
table_nameИмя (опционально с указанием схемы) создаваемой таблицы.
column_nameИмя столбца в новой таблице. Если имена столбцов не указаны, они берутся из имен выходных столбцов запроса.
USINGmethodЭтот необязательный параметр указывает метод доступа к таблице, который будет использоваться для хранения содержимого новой таблицы; метод должен быть методом доступа типа
TABLE. См. Глава 60 для получения дополнительной информации. Если этот параметр не указан, для новой таблицы выбирается метод доступа по умолчанию. См. 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Временная таблица будет удалена в конце текущего блока транзакции.
TABLESPACEtablespace_nametablespace_name- это имя табличного пространства, в котором будет создана новая таблица. Если не указано, будет использовано значение default_tablespace, или temp_tablespaces, если таблица временная.queryA
SELECT,TABLE, orVALUEScommand, or anEXECUTEcommand that runs a preparedSELECT,TABLE, orVALUESquery.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 BE эти скобки являются необязательными.
В стандарте требуется использование
WITH [ NO ] DATAв PostgreSQL, но в PostgreSQL это необязательно.Tantor BE обрабатывает временные таблицы весьма отличным от стандартного способом; см. CREATE TABLE для получения подробной информации.
Предложение
WITHявляется расширением Tantor BE; параметры хранения не являются стандартными.Концепция таблиц в Tantor BE не является частью стандарта. Поэтому, ключевое слово
TABLESPACEявляется расширением.