CREATE TABLE AS
CREATE TABLE AS — создать таблицу из результатов запроса
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED | CONSTANT ] 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.
CONSTANTЕсли указывается, таблица создаётся в режиме «только чтение». В таких таблицах нельзя изменять или добавлять данные, и они не обрабатываются при автоочистке. Вернуть в режим «чтение-запись» такие таблицы невозможно.
IF NOT EXISTSНе считать ошибкой, если отношение с таким именем уже существует; просто выдать замечание и оставить таблицу без изменений.
имя_таблицыИмя создаваемой таблицы (возможно, дополненное схемой).
имя_столбцаИмя столбца в создаваемой таблице. Если имена столбцов не заданы явно, они определяются по именам столбцов результата запроса.
USINGметодЭто дополнительное предложение задаёт табличный метод доступа, который будет использоваться для сохранения содержимого новой таблицы; типом этого метода доступа должен быть
TABLE. Подробнее об этом рассказывается в Главе 62. В случае отсутствия этого указания для новой таблицы выбирается метод доступа по умолчанию. За подробностями обратитесь к 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является расширением.