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 OIDSWITHOUT 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является расширением.