CREATE TABLE AS
CREATE TABLE AS â ÑоздаÑÑ ÑаблиÑÑ Ð¸Ð· ÑезÑлÑÑаÑов запÑоÑа
СинÑакÑиÑ
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] имÑ_ÑаблиÑÑ
[ (имÑ_ÑÑолбÑа [, ...] ) ]
[ USING меÑод ]
[ WITH ( паÑамеÑÑ_Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ [= знаÑение] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE Ñабл_пÑоÑÑÑанÑÑво ]
AS query
[ WITH [ NO ] DATA ]ÐпиÑание
CREATE TABLE AS ÑоздаÑÑ ÑаблиÑÑ Ð¸ наполнÑÐµÑ ÐµÑ Ð´Ð°Ð½Ð½Ñми, полÑÑеннÑми в ÑезÑлÑÑаÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SELECT. СÑолбÑÑ ÑÑой ÑаблиÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¸Ð¼ÐµÐ½Ð° и ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
в ÑооÑвеÑÑÑвии Ñо ÑÑолбÑами ÑезÑлÑÑаÑа SELECT (Ñ
оÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов можно пеÑеопÑеделиÑÑ, добавив Ñвно ÑпиÑок новÑÑ
имÑн ÑÑолбÑов).
CREATE TABLE AS Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ Ñоздание пÑедÑÑавлениÑ, но на Ñамом деле еÑÑÑ Ð·Ð½Ð°ÑиÑелÑÐ½Ð°Ñ ÑазниÑа: ÑÑа команда ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑаблиÑÑ Ð¸ вÑполнÑÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ ÑолÑко Ñаз, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½Ð¸ÑÑ ÑаблиÑÑ Ð½Ð°ÑалÑнÑми даннÑми. ÐоÑледÑÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² иÑÑ
однÑÑ
ÑаблиÑаÑ
запÑоÑа в новой ÑаблиÑе оÑÑажаÑÑÑÑ Ð½Ðµ бÑдÑÑ. С пÑедÑÑавлением, напÑоÑив, опÑеделÑÑÑÐ°Ñ ÐµÐ³Ð¾ команда SELECT вÑполнÑеÑÑÑ Ð¿Ñи каждой вÑбоÑке из него.
Ðоманда CREATE TABLE AS ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð¿Ñава CREATE Ð´Ð»Ñ ÑÑ
емÑ, вÑбÑанной Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð°ÑеÑиализованного пÑедÑÑавлениÑ.
ÐаÑамеÑÑÑ
GLOBALилиLOCALÐÐ»Ñ ÑовмеÑÑимоÑÑи игноÑиÑÑÑÑÑÑ. ÐÑполÑзование ÑÑÐ¸Ñ ÐºÐ»ÑÑевÑÑ Ñлов ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE TABLE.
TEMPORARYилиTEMPÐÑли Ñказано, ÑÐ¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ ÑаблиÑа бÑÐ´ÐµÑ Ð²Ñеменной. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE TABLE.
UNLOGGEDÐÑли Ñказано, ÑÐ¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ ÑаблиÑа бÑÐ´ÐµÑ Ð½ÐµÐ¶ÑÑналиÑÑемой. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE TABLE.
IF NOT EXISTSÐе ÑÑиÑаÑÑ Ð¾Ñибкой, еÑли оÑноÑение Ñ Ñаким именем Ñже ÑÑÑеÑÑвÑеÑ; пÑоÑÑо вÑдаÑÑ Ð·Ð°Ð¼ÐµÑание и оÑÑавиÑÑ ÑаблиÑÑ Ð±ÐµÐ· изменений.
имÑ_ÑаблиÑÑÐÐ¼Ñ Ñоздаваемой ÑаблиÑÑ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
имÑ_ÑÑолбÑаÐÐ¼Ñ ÑÑолбÑа в Ñоздаваемой ÑаблиÑе. ÐÑли имена ÑÑолбÑов не Ð·Ð°Ð´Ð°Ð½Ñ Ñвно, они опÑеделÑÑÑÑÑ Ð¿Ð¾ именам ÑÑолбÑов ÑезÑлÑÑаÑа запÑоÑа.
USINGмеÑодÐÑо дополниÑелÑное пÑедложение задаÑÑ ÑаблиÑнÑй меÑод доÑÑÑпа, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑодеÑжимого новой ÑаблиÑÑ; Ñипом ÑÑого меÑода доÑÑÑпа должен бÑÑÑ
TABLE. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² Ðлаве 63. Ð ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ ÑÑого ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑаблиÑÑ Ð²ÑбиÑаеÑÑÑ Ð¼ÐµÑод доÑÑÑпа по ÑмолÑаниÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº default_table_access_method.WITH (паÑамеÑÑ_Ñ ÑанениÑ[=знаÑение] [, ... ] )ÐÑо пÑедложение опÑеделÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе паÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑаблиÑÑ; Ñм. Ñаздел ÐаÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² опиÑании 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Ñабл_пÑоÑÑÑанÑÑвоÐдеÑÑ
Ñабл_пÑоÑÑÑанÑÑвоâ Ð¸Ð¼Ñ ÑаблиÑного пÑоÑÑÑанÑÑва, в коÑоÑом бÑÐ´ÐµÑ ÑоздаваÑÑÑÑ Ð½Ð¾Ð²Ð°Ñ ÑаблиÑа. ÐÑли оно не Ñказано, вÑбиÑаеÑÑÑ default_tablespace или temp_tablespaces, еÑли ÑаблиÑа вÑеменнаÑ.queryÐоманда
SELECT,TABLEилиVALUES, либо командаEXECUTE, вÑполнÑÑÑÐ°Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй запÑоÑSELECT,TABLEилиVALUES.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. ÐеÑÑандаÑÑнÑе ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ:
СÑандаÑÑ ÑÑебÑÐµÑ Ð·Ð°ÐºÐ»ÑÑаÑÑ Ð¿Ñедложение подзапÑоÑа в Ñкобки, но в PostgreSQL ÑÑи Ñкобки необÑзаÑелÑнÑ.
СÑандаÑÑ ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑказаниÑ
WITH [ NO ] DATA, в PostgreSQL оно необÑзаÑелÑно.PostgreSQL ÑабоÑÐ°ÐµÑ Ñ Ð²ÑеменнÑми ÑаблиÑами не Ñак, как опиÑано в ÑÑандаÑÑе; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE TABLE.
ÐÑедложение
WITHÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL; в ÑÑандаÑÑе паÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ оговаÑиваÑÑÑÑ.ÐонÑепÑÐ¸Ñ ÑаблиÑнÑÑ Ð¿ÑоÑÑÑанÑÑв в PostgreSQL оÑÑÑÑÑÑвÑÐµÑ Ð² ÑÑандаÑÑе. Ðак ÑледÑÑвие, пÑедложение
TABLESPACEÑвлÑеÑÑÑ ÑаÑÑиÑением.