CREATE TABLE AS
CREATE TABLE AS — создать таблицу из результатов запроса
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED | CONSTANT ] 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.
CONSTANT
Если указывается, таблица создаётся в режиме «только чтение». В таких таблицах нельзя изменять или добавлять данные, и они не обрабатываются при автоочистке. Вернуть в режим «чтение-запись» такие таблицы невозможно.
IF NOT EXISTS
Не считать ошибкой, если отношение с таким именем уже существует. В этом случае будет выдано замечание. За подробностями обратитесь к описанию CREATE TABLE.
имя_таблицы
Имя создаваемой таблицы (возможно, дополненное схемой).
имя_столбца
Имя столбца в создаваемой таблице. Если имена столбцов не заданы явно, они определяются по именам столбцов результата запроса.
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. Нестандартные расширения перечислены ниже:
Стандарт требует заключать предложение подзапроса в скобки, но в Postgres Pro эти скобки необязательны.
Стандарт требует наличия указания
WITH [ NO ] DATA
, в Postgres Pro оно необязательно.Postgres Pro работает с временными таблицами не так, как описано в стандарте; за подробностями обратитесь к CREATE TABLE.
Предложение
WITH
является расширением Postgres Pro; в стандарте ни параметры хранения, ни OID не оговариваются.Концепция табличных пространств в Postgres Pro отсутствует в стандарте. Как следствие, предложение
TABLESPACE
является расширением.
См. также
CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUESPostgreSQL 9.4.1 Documentation | |||
---|---|---|---|
Prev | Up | Chapter 43. PL/Python - Python Procedural Language | Next |
43.9. Utility Functions
The plpy module also provides the functions plpy.debug(msg), plpy.log(msg), plpy.info(msg), plpy.notice(msg), plpy.warning(msg), plpy.error(msg), and plpy.fatal(msg). plpy.error
and plpy.fatal
actually raise a Python exception which, if uncaught, propagates out to the calling query, causing the current transaction or subtransaction to be aborted. raise plpy.Error(msg) and raise plpy.Fatal(msg) are equivalent to calling plpy.error
and plpy.fatal
, respectively. The other functions only generate messages of different priority levels. Whether messages of a particular priority are reported to the client, written to the server log, or both is controlled by the log_min_messages and client_min_messages configuration variables. See Chapter 18 for more information.
Another set of utility functions are plpy.quote_literal(string), plpy.quote_nullable(string), and plpy.quote_ident(string). They are equivalent to the built-in quoting functions described in Section 9.4. They are useful when constructing ad-hoc queries. A PL/Python equivalent of dynamic SQL from Example 40-1 would be:
plpy.execute("UPDATE tbl SET %s = %s WHERE key = %s" % ( plpy.quote_ident(colname), plpy.quote_nullable(newvalue), plpy.quote_literal(keyvalue)))