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 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ÑвлÑеÑÑÑ ÑаÑÑиÑением.