CREATE TABLE AS#
CREATE TABLE AS
CREATE TABLE AS — определить новую таблицу на основе результатов запроса
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]table_name
[ (column_name
[, ...] ) ] [ USINGmethod
] [ WITH (storage_parameter
[=value
] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEtablespace_name
] ASquery
[ WITH [ NO ] DATA ]
Описание
CREATE TABLE AS
создает таблицу с заполнением данных, вычисляемых с помощью команды SELECT
. Столбцы таблицы имеют имена и типы данных, связанные с выходными столбцами команды SELECT
(за исключением того, что вы можете переопределить имена столбцов, указав явный список новых имен столбцов).
CREATE TABLE AS
немного похож на создание представления, но на самом деле это совершенно другая операция: она создает новую таблицу и выполняет запрос только один раз для заполнения новой таблицы в начальный момент. Новая таблица не будет отслеживать последующие изменения в исходных таблицах запроса. В отличие от этого, представление переоценивает свое определение SELECT
каждый раз при выполнении запроса.
CREATE TABLE AS
требует наличия привилегии CREATE
на схему, используемую для таблицы.
Параметры
GLOBAL
orLOCAL
Игнорируется для совместимости. Использование этих ключевых слов устарело; см. CREATE TABLE для получения подробной информации.
TEMPORARY
orTEMP
Если указано, таблица создается как временная таблица. Подробности см. в разделе CREATE TABLE.
UNLOGGED
Если указано, таблица создается как незарегистрированная таблица. Подробности см. в разделе CREATE TABLE.
IF NOT EXISTS
Не генерировать ошибку, если отношение с таким же именем уже существует; просто выдать уведомление и оставить таблицу неизменной.
table_name
Имя (опционально с указанием схемы) создаваемой таблицы.
column_name
Имя столбца в новой таблице. Если имена столбцов не указаны, они берутся из имен выходных столбцов запроса.
USING
method
Этот необязательный параметр указывает метод доступа к таблице, который будет использоваться для хранения содержимого новой таблицы; метод должен быть методом доступа типа
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
Временная таблица будет удалена в конце текущего блока транзакции.
TABLESPACE
tablespace_name
tablespace_name
- это имя табличного пространства, в котором будет создана новая таблица. Если не указано, будет использовано значение default_tablespace, или temp_tablespaces, если таблица временная.query
A
SELECT
,TABLE
, orVALUES
command, or anEXECUTE
command that runs a preparedSELECT
,TABLE
, orVALUES
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 BE эти скобки являются необязательными.
В стандарте требуется использование
WITH [ NO ] DATA
в PostgreSQL, но в PostgreSQL это необязательно.Tantor BE обрабатывает временные таблицы весьма отличным от стандартного способом; см. CREATE TABLE для получения подробной информации.
Предложение
WITH
является расширением Tantor BE; параметры хранения не являются стандартными.Концепция таблиц в Tantor BE не является частью стандарта. Поэтому, ключевое слово
TABLESPACE
является расширением.