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

Вы можете:

  • Добавить столбцы
  • Удалить столбцы
  • Добавить ограничения
  • Удалить ограничения
  • Изменить значения по умолчанию
  • Изменить типы данных столбца
  • Переименовать столбцы
  • Переименовать таблицы

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

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

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

ALTER TABLE products ADD COLUMN description text;

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

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

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

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

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

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

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

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

ALTER TABLE products DROP COLUMN description;

Какие бы данные ни были в столбце, они исчезают. Ограничения таблицы, включающие столбец, также отбрасываются. Однако, если на столбец ссылается ограничение внешнего ключа другой таблицы, PostgreSQL не будет молча отбрасывать это ограничение. Вы можете разрешить удаление всего, что зависит от столбца, добавив CASCADE:

ALTER TABLE products DROP COLUMN description CASCADE;

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

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

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;

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

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

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

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

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

ALTER TABLE products DROP CONSTRAINT some_name;

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

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

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

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

(Напомним, что у ненулевых ограничений нет имен.)

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

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

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

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

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

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

Фактически это то же самое, что установить по умолчанию значение 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;