Документация по PostgreSQL 9.1.1 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 5. Определение данных | Fast Forward | Next |
Когда вы создали таблицу и видите, что допустили ошибку или что требования приложения изменились, вы можете удалить эту таблицу и создать её заново. Но это неудобно, если таблица уже содержит данные или если на таблицу ссылаются другие объекты базы данных (например, внешний ключ). Поэтому PostgreSQL предоставляет набор команд для внесения изменений в существующие таблицы. Заметим, что эти действия концептуально отличаются от изменений самих данных, содержащихся в таблице: здесь мы говорим о изменении структуры таблицы.
Вы можете:
Добавить колонки
Удалить колонки
Добавить ограничения
Удалить ограничения
Изменить значения по умолчанию
Изменить типы данных колонок
Переименовать колонки
Переименовать таблицы
Все эти действия выполняются с помощью команды ALTER TABLE, на странице описания которой, можно найти подробности перечисленных здесь действий.
Чтобы добавить колонку, используйте команду вида:
ALTER TABLE products ADD COLUMN description text;
Новая колонка изначально заполняется указанным значением по умолчанию (значением null, если вы не задали другое значение в предложении DEFAULT).
Также в этот момент, вы можете задать ограничения на колонку, используя синтаксис вида:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
Фактически, все опции, которые используются при выполнении команды CREATE TABLE, могут быть применены и здесь. Однако, держите в уме, что значение по умолчанию должно удовлетворять заданным ограничениям, иначе выполнение ADD закончится ошибкой. В качестве альтернативы, вы можете добавить ограничения позже (см. ниже), после того как вы корректно закончили добавление новой колонки.
Tip: Добавление колонки с указанием значения по умолчанию, обновляет каждую строку в таблице (чтобы сохранить новое значение колонки). Однако, если значение по умолчанию не задано, PostgreSQL позволяет избежать физического обновления. Таким образом, если вы задумали заполнить колонку значениями, которые в большинстве своём не совпадают с теми, которые заданы по умолчанию, лучше всего добавить колонку без указания значения по умолчанию, затем вставить нужные значения, используя UPDATE и затем добавить любое значение по умолчанию как описывается ниже.
Чтобы удалить колонку, используйте команду вида:
ALTER TABLE products DROP COLUMN description;
Данные в этой колонке будут потеряны. Ограничения, касающиеся этой колонки также будут удалены. Однако, если на колонку ссылается ограничение внешнего ключа другой таблицы, то PostgreSQL не будет молча удалять это ограничение. Вы можете явно указать удаление зависящего от колонки ограничения, добавив CASCADE:
ALTER TABLE products DROP COLUMN description CASCADE;
См. описание этого механизма в Section 5.12.
Чтобы добавить какое-либо ограничение, используется табличный синтаксис определения этого ограничения. Например:
ALTER TABLE products ADD CHECK (name <> ''); ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no); ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
Чтобы добавить ограничение не-null, которое нельзя записать как ограничение на таблицу, используйте синтаксис:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
Указанное ограничение будет задействовано немедленно, так что данные в таблице перед добавлением ограничения должны ему удовлентворять.
Чтобы удалить ограничение, вам необходимо знать его имя. Если вы сами давали ему имя, то все просто. В противном случае, СУБД назначило автоматически сгенерированное имя, которое нужно найти. В этом может помочь команда \d tablename в psql; другие интерфейсы также могут предоставлять способ инспектирования подробностей таблиц. Затем выполняется команда:
ALTER TABLE products DROP CONSTRAINT some_name;
(Если вы выполняете команду с указанием такого имени ограничения как $2, не забудьте, что вам понадобится заключить имя в двойные кавычки, чтобы имя было воспринято как правильный идентификатор.)
Как и в случае с удалением колонки, вам понадобится добавить CASCADE, если вы хотите удалить ограничение, от которого зависит что либо другое. Например, если некое ограничение внешнего ключа зависит от ограничения уникальности или первичного ключа для ссылочной колонки(ок).
Те же правила работают для всех видов ограничений, исключая ограничения не-null. Чтобы удалить ограничение не-null, используйте
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(Обратите внимание, что ограничения не-null не имеют имени.)
Чтобы установить новое значение по умолчанию для колонки, используйте команду вида:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
Заметим, что выполнение данной команды не влияет на уже существующие строки в таблице, команда изменят значение по умолчанию только для будущих команд INSERT.
Чтобы удалить любое значение по умолчанию, используйте
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
Команда выполняет тоже самое, что и установка значения по умолчанию в null. Поскольку при удалении значения по умолчанию, оно неявно устанавливается в null, в случае удаления существующего значения по умолчанию, сообщений об ошибках, не будет.
Чтобы преобразовать колонку к другому типу данных, используйте команду вида:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
Команда выполнится успешно только если каждая существующая запись в колонке может быть преобразована к новому типу через неявное приведение типа. Если необходимо более сложное преобразование, вам нужно добавить предложение USING, которое определяет как из старого значения будет получено новое.
PostgreSQL будет пытаться преобразовать к новому типу значение по умолчанию, заданное для колонки, а также все ограничения, связанные с этой колонкой. Но эти преобразования могут завершиться ошибкой или могут привести к неожиданным результатам. Часто, лучше удалить все ограничения на колонку перед тем как изменить её тип, а затем добавить соответственно изменённые ограничения обратно.
Чтобы переименовать колонку, используйте команду вида:
ALTER TABLE products RENAME COLUMN product_no TO product_number;
Чтобы переименовать таблицу, используйте команду вида:
ALTER TABLE products RENAME TO items;