5.6. Изменение таблиц#

5.6. Изменение таблиц

5.6. Изменение таблиц #

Если вы создали таблицу, но поняли, что сделали ошибку, или требования приложения изменились, вы можете удалить таблицу и создать ее заново. Но пересоздавать таблицу бывает нецелесообразно, если таблица уже заполнена данными или если на нее ссылаются другие объекты базы данных (например, ограничение внешнего ключа). Поэтому Tantor SE предоставляет набор команд для внесения изменений в существующие таблицы. Обратите внимание, что это концептуально отличается от изменения данных, содержащихся в таблице: здесь мы говорим об изменении определения или структуры таблицы.

Вы можете:

  • Добавить столбцы

  • Удалить столбцы

  • Добавить ограничения

  • Удалить ограничения

  • Изменить значения по умолчанию

  • Изменить типы данных столбцов

  • Переименовать столбцы

  • Переименовать таблицы

Все эти действия выполняются с использованием команды ALTER TABLE, которая более подробно описана в соответствующем разделе справочной информации.

5.6.1. Добавление столбца #

Чтобы добавить столбец, используйте команду:

ALTER TABLE products ADD COLUMN description text;

Новый столбец изначально заполняется указанным значением по умолчанию (null, если не указан DEFAULT).

Подсказка

Начиная с версии PostgreSQL 11, добавление столбца с постоянным значением по умолчанию больше не означает, что каждая строка таблицы будет обновлена при выполнении оператора ALTER TABLE. Вместо этого, значение по умолчанию возвращается при следующем доступе к строке и сохраняется при перезаписи таблицы, и поэтому ALTER TABLE выполняется очень быстро даже на больших таблицах.

Однако, если значение по умолчанию является изменчивым (например, clock_timestamp()), в каждую строку должно вноситься значение, вычисленным во время выполнения ALTER TABLE. Чтобы избежать потенциально длительной операции обновления, особенно если столбец будет заполняться в основном не значениями по умолчанию, может быть предпочтительнее добавить столбец без указания значения по умолчанию, и вставить нужные значения с помощью UPDATE, а затем определить значение по умолчанию, как описано ниже.

Также можно сразу определить ограничения на столбец, используя обычный синтаксис:

ALTER TABLE products ADD COLUMN description text CHECK (description <> '');

Фактически, все опции, применимые к описанию столбца в CREATE TABLE, могут быть использованы здесь. Однако имейте в виду, что значение по умолчанию должно удовлетворять заданным ограничениям, иначе операция ADD завершится неудачей. Также, вы можете добавить ограничения позже (см. ниже), после того, как правильно заполните новый столбец.

5.6.2. Удаление столбца #

Чтобы удалить столбец, используйте команду вида:

ALTER TABLE products DROP COLUMN description;

Любые данные, которые были в столбце, исчезают. Ограничения таблицы, связанные с этим столбцом, также сбрасываются. Однако, если столбец ссылается на ограничение внешнего ключа другой таблицы, Tantor SE не будет неявно сбрасывать это ограничение. Можно разрешить сброс всех объектов, зависящих от столбца, добавив CASCADE:

ALTER TABLE products DROP COLUMN description CASCADE;

В Раздел 5.14 приведен общий механизм, стоящий за ним.

5.6.3. Добавление ограничения #

Для добавления ограничения используется синтаксис ограничения таблицы. Например:

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;

Чтобы добавить ограничение NOT NULL, которое нельзя записать в виде ограничения таблицы, используйте следующий синтаксис:

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

Ограничение проверяется автоматически, и добавляется только если данные таблицы удовлетворяют ему.

5.6.4. Удаление ограничения #

Чтобы удалить ограничение, нужно знать его имя. Если вы присвоили ему имя сами, то это легко. В противном случае система назначила сгенерированное имя, которое нужно узнать. Команда psql \d tablename может быть полезной в этом случае; другие программы также могут предоставить способ просмотра данных о таблицы. Затем используется следующая команда:

ALTER TABLE products DROP CONSTRAINT some_name;

(Если имя ограничения было сгенерировано автоматически, например $2, не забудьте, что его нужно заключить в двойные кавычки, чтобы имя было допустимым идентификатором).

Как и при удалении столбца, необходимо добавить CASCADE, если нужно удалить ограничение, у которого есть зависимые объекты. Примером является ограничение внешнего ключа, которое зависит от ограничения уникальности или первичного ключа на целевых столбцах.

Это работает так же для всех типов ограничений, кроме ограничений not-null. Чтобы удалить ограничение not-null, используйте:

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(Учтите, что ограничения not-null не имеют имен).

5.6.5. Изменение значения по умолчанию столбца #

Чтобы установить новое значение по умолчанию для столбца, используйте команду:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

Обратите внимание, что это не влияет на существующие строки в таблице, а меняет значение по умолчанию для будущих команд INSERT.

Чтобы удалить любое значение по умолчанию, используйте:

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

Это фактически то же самое, что установка значения по умолчанию равным NULL. Как следствие, не является ошибкой удалить значение по умолчанию, если оно не было определено, потому что по умолчанию оно неявно является нулевым.

5.6.6. Изменение типа данных столбца #

Чтобы определить для столбца другой тип данных, используйте команду типа:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

Команда выполнится успешно только если каждая существующая запись в столбце может быть преобразована в новый тип с помощью неявного приведения типов. Если требуется более сложное преобразование, можно добавить предложение USING, которое указывает, как получить новые значения из старых.

Tantor SE попытается преобразовать значение по умолчанию столбца (если оно есть) в новый тип, а также все ограничения, связанные со столбцом. Однако эти преобразования могут завершиться неудачей или привести к неожиданным результатам. Рекомендуется сначала удалить все ограничения на столбец перед изменением его типа, а затем вернуть соответствующие измененные ограничения.

5.6.7. Переименование столбца #

Переименовать столбец:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

5.6.8. Переименование таблицы #

Чтобы переименовать таблицу, выполните:

ALTER TABLE products RENAME TO items;