Использование таблиц
Реструктуризация таблиц командой CREATE TABLE AS
Распространенная методика реструктуризации таблиц основана на использовании команды CREATE TABLE с секцией AS в сочетании с запросом SQL. Команда создает временную таблицу на основании существующей таблицы, после чего временная таблица переименовывается. Физическое создание новой таблицы может сопровождаться удалением полей и изменением порядка их следования с одновременным заполнением данными из исходной таблицы.
В приведенном ниже описании синтаксиса этой усеченной версии команды CREATE TABLE запрос представляет собой команду SELECT для выборки данных, переносимых в новую таблицу. Типы данных всех создаваемых полей определяются типами данных соответствующих полей, выбранных в результате выполнения запроса.
CREATE [ TEMPORARY | TEMP ] TABLE таблица [ (имя_поля [….])] AS запрос
Преимущество такого подхода заключается в том, что создание таблицы и заполнение ее данными происходит в одной команде SQL. Самый заметный недостаток – отсутствие полноценных возможностей для установки ограничений в созданной таблице. После того как таблица создана, в нее можно добавлять только ограничения внешних ключей и проверки. После создания новой таблицы старую таблицу можно переименовать (или уничтожить) и присвоить новой таблице имя старой.
Допустим, из таблицы books удаляется лишнее поле publication, созданное в пункте "Создание полей" подраздела "Модификация таблицы командой ALTER TABLE". Для этого мы создаем усеченную версию таблицы (с перечислением нужных полей) с указанием соответствующей команды SELECT в секции AS команды CREATE TABLE, после чего старая таблица удаляется командой DROP TABLE (листинг 4.14).
Листинг 4.14. Реструктуризация таблицы командой CREATE TABLE AS.
booktown=# \d books Table "books" Attribute | Type | Modifier id | integer | not null title text I not null authorjd | integer | subjectjd integer j publication j date | Index: books_id_pkey booktown=# CREATE TABLE new_books booktown-# (id, title .authorjd, subjectjd) booktown-# AS SELECT id, title, authorjd, subjectjd booktown-f FROM books; SELECT booktown=# ALTER TABLE books RENAME TO old_books; ALTER booktown=# ALTER TABLE new_books RENAME TO books; ALTER booktown=# \d books Table "books" Attribute | Type | Modifier id | integer | title | text | authorjd j integer j subjectjd | integer | booktown=# DROP TABLE books; DROP
Внимание
В PostgreSQL 7.1.x присутствие в команде SELECT необязательного списка полей, заключенного в круглые скобки, исключает использование специального символа *. Недостаток должен быть исправлен в PostgreSQL 7.2.