CREATE TABLE AS
CREATE TABLE AS — создать таблицу из результатов запроса
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]имя_таблицы
[ (имя_столбца
[, ...] ) ] [ WITH (параметр_хранения
[=значение
] [, ... ] ) | WITH OIDS | 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
Не считать ошибкой, если отношение с таким именем уже существует; просто выдать замечание и оставить таблицу без изменений.
имя_таблицы
Имя создаваемой таблицы (возможно, дополненное схемой).
имя_столбца
Имя столбца в создаваемой таблице. Если имена столбцов не заданы явно, они определяются по именам столбцов результата запроса.
WITH (
параметр_хранения
[=значение
] [, ... ] )Это предложение определяет дополнительные параметры хранения для новой таблицы: за подробностями обратитесь к Параметры хранения. Предложение
WITH
может также включать указаниеOIDS=TRUE
(или простоOIDS
), с которым строкам в новой таблице будут назначаться идентификаторы объектов (OID), либо указаниеOIDS=FALSE
, с которым строки не будут содержать OID. За дополнительными сведениями обратитесь к CREATE TABLE.WITH OIDS
WITHOUT OIDS
Это устаревшее написание указаний
WITH (OIDS)
иWITH (OIDS=FALSE)
, соответственно. Если требуется определить одновременно свойствоOIDS
и параметры хранения, необходимо использовать синтаксисWITH ( ... )
; см. ниже.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
.
Команда CREATE TABLE AS
позволяет пользователю явно определить, добавлять ли OID в таблицу. Если присутствие OID не определено явно, оно определяется конфигурационной переменной default_with_oids.
Примеры
Создание таблицы 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
, с применением подготовленного оператора. Новая таблица будет содержать OID и прекратит существование при фиксации транзакции:
PREPARE recentfilms(date) AS SELECT * FROM films WHERE date_prod > $1; CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS EXECUTE recentfilms('2002-01-01');
Совместимость
CREATE TABLE AS
соответствует стандарту SQL. Нестандартные расширения перечислены ниже:
Стандарт требует заключать предложение подзапроса в скобки, но в PostgreSQL эти скобки необязательны.
Стандарт требует наличия указания
WITH [ NO ] DATA
, в PostgreSQL оно необязательно.PostgreSQL работает с временными таблицами не так, как описано в стандарте; за подробностями обратитесь к CREATE TABLE.
Предложение
WITH
является расширением PostgreSQL; в стандарте ни параметры хранения, ни OID не оговариваются.Концепция табличных пространств в PostgreSQL отсутствует в стандарте. Как следствие, предложение
TABLESPACE
является расширением.