CREATE TABLE AS
Синтаксис
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE table_name [ (имя_колонки [, ...] ) ] [ 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.
- table_name
Имя (возможно, дополненное схемой) создаваемой таблицы.
- имя_колонки
Имя колонки в создаваемой таблице. Если имена колонок не заданы явно, они определяются по именам колонок результата запроса.
- WITH ( параметр_хранения [= значение] [, ... ] )
Это предложение определяет дополнительные параметры хранения для новой таблицы: за подробностями обратитесь к Параметры хранения. Предложение WITH может также включать указание OIDS=TRUE (или просто OIDS), с которым строкам в новой таблице будут назначаться идентификаторы объектов (OID), либо указание OIDS=FALSE, с которым строки не будут содержать OID. За дополнительными сведениями обратитесь к CREATE TABLE.
- WITH OIDS
WITHOUT 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. Нестандартные расширения перечислены ниже:
Стандарт требует заключать предложение подзапроса в скобки, но в PostgreSQL эти скобки необязательны.
Стандарт требует присутствия указания WITH [ NO ] DATA, в PostgreSQL оно необязательно.
PostgreSQL работает с временными таблицами не так, как описано в стандарте; за подробностями обратитесь к CREATE TABLE.
Предложение WITH является расширением PostgreSQL; в стандарте ни параметры хранения, ни OID не оговариваются.
Концепция табличных пространств в PostgreSQL отсутствует в стандарте. Как следствие, предложение TABLESPACE является расширением.
Пред. | Начало | След. |
CREATE TABLE | Уровень выше | CREATE TABLESPACE |