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 выполняется при каждой выборке из него.
Параметры
GLOBALилиLOCALДля совместимости игнорируются. Использование этих ключевых слов считается устаревшим; за подробностями обратитесь к CREATE TABLE.
TEMPORARYилиTEMPЕсли указано, создаваемая таблица будет временной. За подробностями обратитесь к CREATE TABLE.
UNLOGGEDЕсли указано, создаваемая таблица будет нежурналируемой. За подробностями обратитесь к CREATE TABLE.
IF NOT EXISTSНе считать ошибкой, если отношение с таким именем уже существует; просто выдать замечание и оставить таблицу без изменений.
имя_таблицыИмя создаваемой таблицы (возможно, дополненное схемой).
имя_столбцаИмя столбца в создаваемой таблице. Если имена столбцов не заданы явно, они определяются по именам столбцов результата запроса.
USINGметодЭто дополнительное предложение задаёт табличный метод доступа, который будет использоваться для сохранения содержимого новой таблицы; типом этого метода доступа должен быть
TABLE. Подробнее об этом рассказывается в Главе 57. В случае отсутствия этого указания для новой таблицы выбирается метод доступа по умолчанию. За подробностями обратитесь к 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. Нестандартные расширения перечислены ниже:
Стандарт требует заключать предложение подзапроса в скобки, но в Postgres Pro эти скобки необязательны.
Стандарт требует наличия указания
WITH [ NO ] DATA, в Postgres Pro оно необязательно.Postgres Pro работает с временными таблицами не так, как описано в стандарте; за подробностями обратитесь к CREATE TABLE.
Предложение
WITHявляется расширением Postgres Pro; в стандарте параметры хранения не оговариваются.Концепция табличных пространств в Postgres Pro отсутствует в стандарте. Как следствие, предложение
TABLESPACEявляется расширением.