ALTER TABLE
Эта страница переведена при помощи нейросети GigaChat.
ALTER TABLE - изменение определения таблицы.
Синтаксис
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
action [, ... ]
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
RENAME [ COLUMN ] column_name TO new_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER TABLE [ IF EXISTS ] name
RENAME TO new_name
ALTER TABLE [ IF EXISTS ] name
SET SCHEMA new_schema
ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
SET TABLESPACE new_tablespace [ NOWAIT ]
ALTER TABLE [ IF EXISTS ] name
ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }
ALTER TABLE [ IF EXISTS ] name
DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]
where action is one of:
ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
ALTER [ COLUMN ] column_name SET EXPRESSION AS ( expression )
ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ]
ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]
ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]
ALTER [ COLUMN ] column_name SET STATISTICS { integer | DEFAULT }
ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
ALTER [ COLUMN ] column_name SET COMPRESSION compression_method
ADD table_constraint [ NOT VALID ]
ADD table_constraint_using_index
ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
ALTER CONSTRAINT constraint_name [ INHERIT | NO INHERIT ]
VALIDATE CONSTRAINT constraint_name
DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
DISABLE TRIGGER [ trigger_name | ALL | USER ]
ENABLE TRIGGER [ trigger_name | ALL | USER ]
ENABLE REPLICA TRIGGER trigger_name
ENABLE ALWAYS TRIGGER trigger_name
DISABLE RULE rewrite_rule_name
ENABLE RULE rewrite_rule_name
ENABLE REPLICA RULE rewrite_rule_name
ENABLE ALWAYS RULE rewrite_rule_name
DISABLE ROW LEVEL SECURITY
ENABLE ROW LEVEL SECURITY
FORCE ROW LEVEL SECURITY
NO FORCE ROW LEVEL SECURITY
CLUSTER ON index_name
SET WITHOUT CLUSTER
SET WITHOUT OIDS
SET ACCESS METHOD { new_access_method | DEFAULT }
SET TABLESPACE new_tablespace
SET { LOGGED | UNLOGGED }
SET ( storage_parameter [= value] [, ... ] )
RESET ( storage_parameter [, ... ] )
INHERIT parent_table
NO INHERIT parent_table
OF type_name
NOT OF
OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }
and partition_bound_spec is:
IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )
and column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL [ NO INHERIT ] |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ] |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
NOT NULL column_name [ NO INHERIT ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] [, PERIOD column_name ] ) REFERENCES reftable [ ( refcolumn [, ... ] [, PERIOD refcolumn ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
and table_constraint_using_index is:
[ CONSTRAINT constraint_name ]
{ UNIQUE | PRIMARY KEY } USING INDEX index_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:
[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]
exclude_element in an EXCLUDE constraint is:
{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
referential_action in a FOREIGN KEY/REFERENCES constraint is:
{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }
Описание
ALTER TABLE изменяет определение существующей таблицы. Существует множество подформ этой команды, описанных ниже. Обратите внимание, что уровень блокировки может различаться в зависимости от конкретной подформы. Если не указано иное, используется блокировка уровня ACCESS EXCLUSIVE. Когда используется несколько подкоманд одновременно, будет применен наиболее строгий уровень блокировки из всех используемых.
ADD COLUMN [ IF NOT EXISTS ]
Добавляет в таблицу новый столбец, используя ту же синтаксическую структуру, что и в CREATE TABLE. Если указано IF NOT EXISTS, и столбец с таким именем уже существует, ошибка не возникает.
DROP COLUMN [ IF EXISTS ]
Удаляет столбец из таблицы. При этом автоматически удаляются все индексы и ограничения таблицы, в которых этот столбец участвовал. Также будут удалены многомерные статистики, ссылающиеся на удаляемый столбец, если после удаления в них останется только один столбец. Если на удаляемый столбец есть внешние зависимости (например, внешний ключ в другой таблице или представление), необходимо использовать CASCADE. Если указано IF EXISTS, и столбец отсутствует, ошибка не возникнет — вместо этого будет выдано уведомление.
SET DATA TYPE
Позволяет изменить тип данных столбца. Индексы и простые ограничения таблицы, связанные с этим столбцом, будут автоматически адаптированы к новому типу путем повторного разбора изначально заданного выражения. Можно указать необязательную директиву COLLATE для установки новой сортировки (если не указана, используется сортировка по умолчанию для нового типа данных). Также можно задать выражение USING, определяющее, как преобразовать старые значения в новые. Если USING не указано, применяется стандартное преобразование через приведение типов. Обязательное использование USING требуется, если не существует ни неявного, ни явного преобразования между старым и новым типом.
При использовании этого способа статистика столбца удаляется, поэтому рекомендуется после этого выполнить команду ANALYZE для всей таблицы. Для виртуально сгенерированного столбца команда ANALYZE не требуется, поскольку такие столбцы никогда не имеют статистики.
SET/DROP DEFAULT
Устанавливают или удаляют значение по умолчанию для столбца. Удаление аналогично установке значения по умолчанию NULL. Новое значение будет использоваться только при будущих операциях INSERT или UPDATE. Уже существующие строки в таблице не изменяются.
SET/DROP NOT NULL
Управляют разрешением или запретом значений NULL в столбце.
Команда SET NOT NULL может быть применена к столбцу только в том случае, если ни одна из записей в таблице не содержит значения NULL для этого столбца. Обычно это проверяется во время выполнения команды ALTER TABLE путем сканирования всей таблицы, если не указан параметр NOT VALID, однако, если существует допустимое ограничение CHECK (и оно не удалено в той же команде), которое доказывает, что значение NULL не может существовать, сканирование таблицы пропускается. Если столбец имеет недопустимое ограничение NOT NULL, команда SET NOT NULL проверяет его.
Если эта таблица является секцией, то нельзя выполнить команду DROP NOT NULL для столбца, если он помечен как NOT NULL в родительской таблице. Чтобы удалить ограничение NOT NULL из всех секций, выполните команду DROP NOT NULL для родительской таблицы. Даже если в родительской таблице нет ограничения NOT NULL, такое ограничение все равно можно добавить к отдельным секциям, если это необходимо, то есть дочерние таблицы могут запрещать значения NULL, даже если родительская таблица их разрешает, но не наоборот. Также можно удалить ограничение NOT NULL только из родительской таблицы, что не удаляет его из дочерних таблиц.
SET EXPRESSION AS
Эта форма заменяет выражение сгенерированного столбца. Существующие данные в сохраненном сгенерированном столбце перезаписываются, и все будущие изменения будут применять новое выражение генерации.
При использовании этой формы для сохраненного сгенерированного столбца его статистика удаляется, поэтому рекомендуется после этого выполнить команду ANALYZE для таблицы. Для виртуального сгенерированного столбца команда ANALYZE не требуется, поскольку такие столбцы никогда не имеют статистики.
DROP EXPRESSION [ IF EXISTS ]
Превращает сгенерированный столбец в обычный. Данные в столбце сохраняются, но дальнейшие изменения в таблице не будут применять выражение генерации.
В настоящее время эта форма поддерживается только для сгенерированных столбцов (а не для виртуальных).
Если указан параметр DROP EXPRESSION IF EXISTS и столбец не является сгенерированным, ошибка не возникает. В этом случае вместо этого выдается уведомление.
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITYSET GENERATED { ALWAYS | BY DEFAULT }DROP IDENTITY [ IF EXISTS ]
Изменяют свойства идентификационного столбца или превращают обычный столбец в таковой. Смотрите CREATE TABLE для получения подробной информации. Такие изменения, как и SET DEFAULT, применяются только к будущим INSERT и UPDATE. Существующие строки не затрагиваются.
Если указан DROP IDENTITY IF EXISTS, а столбец не является идентификационным, будет выдано уведомление вместо ошибки.
SET sequence_optionRESTART
Позволяют изменить параметры последовательности, используемой идентификационным столбцом. Можно задавать любые параметры, поддерживаемые в ALTER SEQUENCE, например INCREMENT BY.
SET STATISTICS
В этой форме задается цель сбора статистики по столбцам для последующих операций ANALYZE. Цель может быть установлена в диапазоне от 0 до 10000. Установите значение DEFAULT, чтобы вернуться к использованию целевого параметра системной статистики по умолчанию (default_statistics_target). Установка значения -1 - устаревший способ получения того же результата.
Эта команда запрашивает блокировку SHARE UPDATE EXCLUSIVE.
SET (attribute_option = value [, ... ] )RESET (attribute_option [, ... ])
Эта форма устанавливает или сбрасывает параметры для каждого атрибута. В настоящее время единственными определенными параметрами для каждого атрибута являются n_distinct и n_distinct_inherited, которые переопределяют оценки количества уникальных значений, сделанные последующими операциями ANALYZE. n_distinct влияет на статистику для самой таблицы, а n_distinct_inherited влияет на статистику, собираемую для таблицы и ее наследуемых дочерних элементов, а также для статистики, собираемой для секционированных таблиц. Если указанное значение является положительным, планировщик запросов будет предполагать, что столбец содержит ровно указанное количество уникальных ненулевых значений. Также можно указать дробные значения, используя значения меньше 0 и больше или равные -1. Это указывает планировщику запросов оценить количество уникальных значений, умножив абсолютное значение указанного числа на предполагаемое количество строк в таблице. Например, значение -1 означает, что все значения в столбце уникальны, а значение -0,5 означает, что каждое значение встречается в среднем дважды. Это может быть полезно, когда размер таблицы меняется со временем.
Изменение параметров для каждого атрибута приводит к получению блокировки SHARE UPDATE EXCLUSIVE.
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
Задает режим хранения данных для столбца. Это определяет, будет ли столбец храниться внутри таблицы или во вспомогательной таблице TOAST, и нужно ли сжимать данные.
Доступны следующие режимы хранения:
PLAIN— используется для значений фиксированной длины (например,integer). Хранится внутри, без сжатия.MAIN— данные хранятся внутри и сжаты.EXTERNAL— данные хранятся вне основной строки (в TOAST), но без сжатия.EXTENDED— данные хранятся вне основной строки и сжимаются. Это режим по умолчанию для большинства типов, поддерживающих не-PLAIN хранение.
Использование EXTERNAL позволяет ускорить операции с подстроками на очень больших значениях text и bytea, за счет увеличенного объема хранения.
Обратите внимание, SET STORAGE сам по себе ничего не меняет в таблице, он только задает стратегию, которая будет использоваться при будущих обновлениях таблицы.
Смотрите раздел TOAST для получения дополнительной информации.
SET COMPRESSION compression_method
Задает метод сжатия для столбца, определяя, как значения, вставляемые в будущем, будут сжиматься (если режим хранения допускает сжатие вообще).
Это не приводит к переписыванию таблицы, поэтому существующие данные могут по-прежнему быть сжаты с использованием других методов сжатия. Если таблица будет восстановлена с помощью pg_restore, тогда все значения будут перезаписаны с использованием настроенного метода сжатия.
Когда данные вставляются из другой таблицы (например, с помощью INSERT ... SELECT), значения из исходной таблицы необязательно будут «развернуты», поэтому любые ранее сжатые данные могут сохранить существующий метод сжатия, вместо того чтобы быть сжатыми заново с использованием метода, установленного для целевого столбца.
Поддерживаемые методы сжатия — pglz и lz4. lz4 доступен только в том случае, если PostgreSQL был собран с флагом --with-lz4. В дополнение, compression_method может быть default, что означает использование поведения по умолчанию — обратиться к значению параметра default_toast_compression во время вставки данных, чтобы определить, какой метод сжатия использовать.
ADD table_constraint [ NOT VALID ]
Добавляет новое ограничение в таблицу, используя тот же синтаксис, что и CREATE TABLE, с возможностью указания параметра NOT VALID, который в настоящее время разрешен только для ограничений внешнего ключа (foreign key) и CHECK.
Обычно эта форма приведет к сканированию таблицы для проверки того, что все существующие строки удовлетворяют новому ограничению.
Но если используется NOT VALID, это потенциально длительное сканирование будет пропущено. Тем не менее, ограничение будет применяться ко всем последующим вставкам или обновлениям (то есть такие операции будут завершаться с ошибкой, если, например, в таблице нет соответствующей строки — в случае внешнего ключа, или если новая строка не удовлетворяет условию CHECK). Но база данных не будет считать, что ограничение выполняется для всех строк в таблице, пока оно не будет явно проверено с помощью команды VALIDATE CONSTRAINT. Смотрите примечания ниже для получения дополнительной информации об использовании NOT VALID.
Хотя большинство форм ADD table_constraint требуют блокировки типа ACCESS EXCLUSIVE, ADD FOREIGN KEY требует только блокировку SHARE ROW EXCLUSIVE. Обратите внимание, что ADD FOREIGN KEY также получает блокировку SHARE ROW EXCLUSIVE на ссылающуюся таблицу, в дополнение к блокировке на таблицу, в которой объявлено ограничение.
Дополнительные ограничения применяются, если уникальные или первичные ключи добавляются в партиционированные таблицы (смотрите CREATE TABLE).
ADD table_constraint_using_index
Добавляет новое ограничение PRIMARY KEY или UNIQUE в таблицу, используя уже существующий уникальный индекс. Все столбцы индекса будут включены в ограничение.
Индекс не может содержать выражения и не может быть частичным. Кроме того, он должен быть btree-индексом с сортировкой по умолчанию. Эти ограничения обеспечивают, что индекс эквивалентен тому, который был бы построен с помощью обычной команды ADD PRIMARY KEY или ADD UNIQUE.
Если указано PRIMARY KEY и столбцы индекса еще не помечены как NOT NULL, тогда эта команда попытается выполнить ALTER COLUMN SET NOT NULL для каждого такого столбца. Это потребует полного сканирования таблицы, чтобы убедиться, что столбцы не содержат NULL. Во всех остальных случаях операция выполняется быстро.
Если указано имя ограничения, тогда индекс будет переименован в имя ограничения. В противном случае ограничение получит то же имя, что и индекс.
После выполнения этой команды индекс будет «принадлежать» ограничению, так же как если бы он был создан обычной командой ADD PRIMARY KEY или ADD UNIQUE. В частности, удаление ограничения приведет к удалению индекса.
Эта форма в настоящее время не поддерживается для партиционированных таблиц.
Добавление ограничения с использованием существующего индекса может быть полезно в ситуациях, когда необходимо добавить новое ограничение, не блокируя обновление таблицы на длительное время. Для этого создайте индекс с помощью функцииCREATE UNIQUE INDEX CONCURRENTLY, а затем преобразуйте его в ограничение, используя этот синтаксис. Смотрите пример ниже.
ALTER CONSTRAINT
Изменяет свойства ранее созданного ограничения. В настоящее время могут быть изменены только ограничения внешнего ключа.
ALTER CONSTRAINT ... INHERIT
ALTER CONSTRAINT ... NO INHERIT
Эти формы изменяют наследуемое ограничение таким образом, что оно становится ненаследуемым, или наоборот. В настоящее время таким образом можно изменять только ограничения типа «не-нулевой». Помимо изменения статуса наследуемости ограничения, в случае, если ненаследуемое ограничение помечается как наследуемое, если у таблицы есть дочерние элементы, к ним будет добавлено эквивалентное ограничение. Если пометить наследуемое ограничение как ненаследуемое для таблицы с дочерними элементами, то соответствующее ограничение для дочерних элементов будет помечено как больше не наследуемое, но не удалено.
VALIDATE CONSTRAINT
Эта форма проверяет внешний ключ, проверку или ограничение типа «не NULL», которые ранее были созданы как «NOT VALID», сканируя таблицу, чтобы убедиться в отсутствии строк, для которых ограничение не выполняется. Если ограничение было установлено как «NOT ENFORCED», генерируется ошибка. Ничего не происходит, если ограничение уже помечено как действительное.
Команда требует блокировки SHARE UPDATE EXCLUSIVE.
DROP CONSTRAINT [ IF EXISTS ]
Удаляет указанное ограничение из таблицы, вместе с любым индексом, лежащим в его основе. Если указано IF EXISTS и ограничение не существует, ошибка подавляется, и выдается уведомление.
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER
Управляют срабатыванием триггеров, принадлежащих таблице. Отключенный триггер все еще известен системе, но не будет выполняться при наступлении соответствующего события. Для отложенных триггеров статус включения проверяется в момент наступления события, а не при выполнении функции триггера.
Можно отключить или включить конкретный триггер по имени, все триггеры в таблице или только пользовательские триггеры (исключая триггеры, автоматически созданные для обеспечения ограничений, например внешних ключей или откладываемых ограничений уникальности и исключения).
Отключение или включение автоматически созданных ограничительных триггеров требует прав суперпользователя. Выполнять это следует с осторожностью, так как целостность данных не может быть гарантирована, если такие триггеры не выполняются.
Механизм срабатывания триггеров также зависит от переменной конфигурации session_replication_role. Просто включенные триггеры (по умолчанию) срабатывают, если роль репликации — origin (по умолчанию) или local. Триггеры, включенные с ENABLE REPLICA, будут срабатывать только в режиме replica, а ENABLE ALWAYS срабатывают при любом режиме.
Это означает, что по умолчанию триггеры не срабатывают на репликах. Это полезно, потому что, если триггер на исходной таблице копирует данные в другую таблицу, система репликации также скопирует эти данные, и на реплике повторное срабатывание триггера приведет к дублированию. Но если триггер выполняет другую функцию, например, создает внешние уведомления, может иметь смысл установить для него ENABLE ALWAYS, чтобы он срабатывал и на репликах.
Когда эта команда применяется к партиционированной таблице, состояния соответствующих копий триггеров в разделах также обновляются, если не указано ONLY.
Команда требует блокировки SHARE ROW EXCLUSIVE.
DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE
Управляют срабатыванием правил переписывания запросов, связанных с таблицей. Отключенное правило все еще известно системе, но не применяется при переписывании запросов. Семантика аналогична отключенным/включенным триггерам.
Эта настройка игнорируется для правил ON SELECT, которые всегда применяются, чтобы представления работали даже при нестандартной роли репликации в текущей сессии.
Механизм срабатывания правил также зависит от переменной session_replication_role, как описано выше для триггеров.
DISABLE/ENABLE ROW LEVEL SECURITY
Управляют применением политик безопасности на уровне строк, связанных с таблицей. Если включено и для таблицы нет политик, применяется политика отказа по умолчанию.
Обратите внимание, что политики могут существовать, даже если безопасность на уровне строк отключена. В этом случае политики не применяются и игнорируются. Смотрите также CREATE POLICY.
NO FORCE/FORCE ROW LEVEL SECURITY
Управляют применением политик безопасности на уровне строк, когда пользователь является владельцем таблицы. Если включено, политики применяются и к владельцу таблицы. Если отключено (по умолчанию), политики не применяются к владельцу таблицы. Смотрите также CREATE POLICY.
CLUSTER ON
Задает индекс по умолчанию для будущих операций CLUSTER. Сама таблица при этом не реорганизуется.
Изменение параметров кластеризации требует блокировки SHARE UPDATE EXCLUSIVE.
SET WITHOUT CLUSTER
Удаляет спецификацию последнего использованного индекса CLUSTER из таблицы. Это влияет на будущие операции кластеризации, в которых не указан индекс.
Изменение параметров кластеризации требует блокировки SHARE UPDATE EXCLUSIVE.
SET WITHOUT OIDS
Задает обратносовместимый синтаксис для удаления системного столбца oid. Так как столбцы oid больше не могут быть добавлены, эта команда не оказывает никакого эффекта.
SET ACCESS METHOD
Эта форма изменяет метод доступа к таблице, переписывая его с использованием указанного метода доступа. При указании DEFAULT выбирается метод доступа, установленный в качестве параметра конфигурации default_table_access_method. Дополнительную информацию смотрите раздел «Определение интерфейса для табличных методов доступа».
При применении к партиционированной таблице нет необходимости переписывать данные, но в секциях, созданных впоследствии, по умолчанию будет использоваться данный метод доступа, если он не переопределен предложением USING. Указание значения ПО УМОЛЧАНИЮ удаляет предыдущее значение, в результате чего для будущих разделов по умолчанию будет использоваться значение default_table_access_method.
SET TABLESPACE
Изменяет табличное пространство таблицы на указанное и перемещает связанные с ней файлы данных в новое табличное пространство. Индексы таблицы, если они есть, не перемещаются, их можно переместить отдельно с помощью дополнительных команд SET TABLESPACE.
При применении к партиционированной таблице данные не перемещаются, но все будущие разделы, создаваемые с помощью CREATE TABLE ... PARTITION OF, будут использовать это табличное пространство, если иное не указано через TABLESPACE.
Можно переместить все таблицы в текущей базе данных, находящиеся в определенном табличном пространстве, используя форму ALL IN TABLESPACE. При этом сначала блокируются все таблицы, затем они перемещаются. Эта форма также поддерживает OWNED BY, чтобы перемещать только таблицы, принадлежащие указанным ролям. Если указано NOWAIT, команда завершится ошибкой, если не удастся сразу захватить все необходимые блокировки.
Обратите внимание, что системные каталоги не перемещаются этой командой, для этого используйте ALTER DATABASE или явные вызовы ALTER TABLE, если это необходимо. Связи information_schema не считаются частью системных каталогов и будут перемещены. Смотрите также CREATE TABLESPACE.
SET { LOGGED | UNLOGGED }
Изменяет таблицу с нежурналируемой на журналируемую или наоборот (смотрите UNLOGGED). Не может быть применена к временной таблице.
Также изменяется режим журналирования любых последовательностей, связанных с таблицей (например, для столбцов идентичности или серийного номера). Тем не менее, возможно изменить режим журналирования таких последовательностей отдельно.
Данная форма не поддерживается для секционированных таблиц.
SET (storage_parameter [= value] [, ... ])
Изменяет один или несколько параметров хранения для таблицы.
Смотрите раздел Параметры хранения в документации CREATE TABLE для получения информации о доступных параметрах.
Обратите внимание, что содержимое таблицы не будет немедленно изменено этой командой. В зависимости от параметра может потребоваться переписать таблицу, чтобы изменения вступили в силу. Это можно сделать с помощью VACUUM FULL, CLUSTER или одной из форм ALTER TABLE, которая требует переписывания таблицы.
Для параметров, связанных с планировщиком запросов, изменения вступают в силу при следующей блокировке таблицы, текущие запросы не затрагиваются.
Блокировка SHARE UPDATE EXCLUSIVE будет установлена при изменении параметров fillfactor, toast, параметров autovacuum, а также планировочного параметра parallel_workers.
RESET (storage_parameter [, ... ])
Сбрасывает один или несколько параметров хранения к значениям по умолчанию. Как и с SET, может потребоваться переписать таблицу, чтобы изменения полностью вступили в силу.
INHERIT parent_table
Добавляет целевую таблицу в качестве нового дочернего элемента указанной родительской таблицы. После этого запросы к родительской таблице будут включать записи из дочерней таблицы. Чтобы быть добавленной как дочерняя, целевая таблица должна уже содержать все те же столбцы, что и родительская (она может также содержать дополнительные столбцы). Типы данных столбцов должны совпадать, и если в родительской таблице есть ограничения NOT NULL, то такие же ограничения должны быть и в дочерней таблице.
Кроме того, все ограничения CHECK и NOT NULL, установленные в родительской таблице, должны также существовать в дочерней таблице, за исключением тех, которые помечены как ненаследуемые (то есть, созданных с помощью ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT), которые игнорируются. Все ограничения дочерней таблицы, для которых выполняется условие, не должны быть помечены как ненаследуемые. В настоящее время ограничения UNIQUE, PRIMARY KEY и FOREIGN KEY не учитываются, но в будущем это может измениться.
NO INHERIT parent_table
Удаляет целевую таблицу из списка дочерних таблиц указанной родительской таблицы. Запросы к родительской таблице больше не будут включать записи из целевой таблицы.
OF type_name
Связывает таблицу с составным типом, как если бы она была создана с помощью CREATE TABLE OF. Список имен и типов столбцов таблицы должен точно соответствовать составному типу. Таблица не должна наследоваться от другой таблицы. Эти ограничения гарантируют, что CREATE TABLE OF допустит эквивалентное определение таблицы.
NOT OF
Отделяет типизированную таблицу от ее типа.
OWNER TO
Изменяет владельца таблицы, последовательности, представления, материализованного представления или внешней таблицы на указанного пользователя.
REPLICA IDENTITY
Изменяет информацию, записываемую в журнал предварительной записи, чтобы идентифицировать строки, которые обновляются или удаляются. В большинстве случаев старое значение каждого столбца записывается только в случае отличия от нового значения, но если старое значение хранится внешне, оно всегда записывается вне зависимости от изменений. Этот параметр влияет только при использовании логической репликации.
DEFAULT — записывает старые значения столбцов первичного ключа. Это значение используется по умолчанию для несистемных таблиц. Если первичный ключ отсутствует, поведение аналогично поведению объекта NOTHING.
USING INDEX index_name — записывает старые значения столбцов, покрываемых указанным индексом, который должен быть уникальным, неполным, неотложенным и включать только столбцы с ограничением NOT NULL. Если индекс будет удален, поведение будет такое же, как у NOTHING.
FULL — записывает старые значения всех столбцов строки.
NOTHING — не записывает информацию о старой строке. Это поведение по умолчанию для системных таблиц.
RENAME
Изменяют имя таблицы (индекса, последовательности, представления, материализованного представления или внешней таблицы), имя отдельного столбца в таблице или имя ограничения таблицы. При переименовании ограничения, которое имеет связанный индекс, переименовывается также индекс. На сохраненные данные это не влияет.
SET SCHEMA
Перемещает таблицу в другую схему. Также перемещаются связанные индексы, ограничения и последовательности, принадлежащие столбцам таблицы.
ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }
Присоединяет существующую таблицу (которая сама может быть партиционированной) как партицию к целевой таблице. Таблицу можно присоединить как партицию для конкретных значений с помощью FOR VALUES или как партицию по умолчанию с помощью DEFAULT. Для каждого индекса в целевой таблице будет создан соответствующий в присоединяемой таблице, или, если эквивалентный индекс уже существует, он будет присоединен как будто выполнена команда ALTER INDEX ATTACH PARTITION. Обратите внимание, что если присоединяемая таблица является внешней, то ее нельзя присоединить как партицию, если в целевой таблице есть уникальные индексы. Смотрите также CREATE FOREIGN TABLE. Для каждого пользовательского триггера на уровне строки, существующего в целевой таблице, создается соответствующий триггер в присоединяемой таблице.
Партиция с FOR VALUES использует ту же синтаксис для partition_bound_spec, что и CREATE TABLE. Спецификация границ партиции должна соответствовать стратегии партиционирования и ключу партиционирования целевой таблицы. Присоединяемая таблица должна содержать те же столбцы, что и целевая, и не больше. Также типы столбцов должны совпадать. Она также должна содержать все ограничения NOT NULL и CHECK целевой таблицы, не помеченные как NO INHERIT. В настоящее время ограничения FOREIGN KEY не учитываются. Ограничения UNIQUE и PRIMARY KEY из родительской таблицы будут созданы в партиции, если они еще не существуют.
Если новая партиция — обычная таблица, выполняется полное сканирование таблицы для проверки, что существующие строки не нарушают ограничение партиции. Можно избежать этого сканирования, добавив действительное ограничение CHECK, допускающее только строки, соответствующие ограничению партиции, до выполнения команды. Это ограничение будет использовано, чтобы определить, что сканирование не требуется. Однако это не сработает, если ключ партиционирования является выражением и партиция не допускает NULL. При присоединении партиции по списку, не допускающей NULL, следует также добавить ограничение NOT NULL на столбец ключа партиционирования, если это не выражение.
Если новая партиция — внешняя таблица, проверка соответствия строк ограничениям партиции не производится. Обсуждение ограничений сторонней таблицы можно найти в CREATE FOREIGN TABLE.
Если у таблицы есть партиция по умолчанию, определение новой партиции изменяет ограничение партиции по умолчанию. Такая партиция не может содержать строки, которые должны быть перемещены в новую партицию, и будет просканирована для проверки их отсутствия. Это сканирование, как и сканирование новой партиции, можно избежать, если присутствует соответствующее ограничение CHECK. Как и сканирование новой партиции, оно всегда пропускается, если партиция по умолчанию — внешняя таблица.
Присоединение партиции требует блокировки SHARE UPDATE EXCLUSIVE на родительской таблице, а также ACCESS EXCLUSIVE на присоединяемой таблице и партиции по умолчанию (если есть).
Дополнительные блокировки требуются для всех вложенных партиций, если присоединяемая таблица также партиционирована. То же самое верно, если партиция по умолчанию также партиционирована. Эти блокировки можно избежать, добавив ограничение CHECK.
DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]
Отсоединяет указанную партицию от целевой таблицы. Отсоединенная партиция остается существующей таблицей, но больше не связана с исходной таблицей. Все индексы, присоединенные к индексам целевой таблицы, отсоединяются. Все триггеры, созданные как клоны из целевой таблицы, удаляются. Получена блокировка SHARE для всех таблиц, ссылающихся на эту партиционированную таблицу по внешним ключам.
Если указано CONCURRENTLY, операция выполняется с пониженным уровнем блокировки, чтобы избежать блокирования других сессий, использующих партиционированную таблицу. В этом режиме используются две транзакции. В первой транзакции получаются блокировки SHARE UPDATE EXCLUSIVE на родительской таблице и партиции, и партиция помечается как находящаяся в процессе отсоединения, затем транзакция фиксируется, и ожидается завершение всех других транзакций, использующих партиционированную таблицу. После этого вторая транзакция получает блокировки SHARE UPDATE EXCLUSIVE на родительской таблице и ACCESS EXCLUSIVE на партиции, и завершает отсоединение. В партицию добавляется ограничение CHECK, дублирующее ограничение партиции. CONCURRENTLY нельзя использовать внутри блока транзакций и нельзя применять, если в партиционированной таблице есть партиция по умолчанию.
Если указано FINALIZE, завершает ранее начатое, но прерванное или отмененное выполнение DETACH CONCURRENTLY. В партиционированной таблице может быть не более одной партиции в состоянии ожидания отсоединения одновременно.
Все формы ALTER TABLE, которые действуют на одну таблицу (кроме RENAME, SET SCHEMA, ATTACH PARTITION и DETACH PARTITION), можно объединять в список из нескольких изменений, применяемых вместе. Например, можно одновременно добавить несколько столбцов и/или изменить типы нескольких столбцов. Это особенно полезно для больших таблиц, поскольку обход таблицы производится один раз.
Чтобы выполнить эту команду, необходимо быть владельцем таблицы. Чтобы переместить таблицу в другую схему, необходимо иметь привилегию CREATE в новой схеме или табличном пространстве. Чтобы добавить таблицу как дочернюю к родительской, необходимо владеть и родительской таблицей. Также, чтобы присоединить таблицу как партицию, нужно владеть присоединяемой таблицей.
Изменить владельца можно только при условии, что текущий пользователь является прямым или косвенным членом новой роли владельца, а также эта роль должна иметь привилегию CREATE в схеме таблицы. Эти ограничения гарантируют, что изменение владельца не даст больше прав, чем пересоздание таблицы. Однако суперпользователь может изменить владельца любой таблицы. Чтобы добавить столбец, изменить его тип или использовать OF, необходимо иметь привилегию USAGE на соответствующий тип данных.
Параметры
IF EXISTS
Подавляет ошибку, если указанная таблица не существует, вместо этого выводится уведомление.
name
Задает имя существующей таблицы, при необходимости дополненное схемой, которая должна быть изменена. Если перед именем таблицы указано ONLY, будет изменена только эта таблица. Если ONLY не указано, будут изменены как таблица, так и все ее дочерние таблицы (если есть). Опционально можно указать * после имени таблицы, чтобы явно обозначить включение дочерних таблиц.
column_name
Задает имя нового или существующего столбца.
new_column_name
Указывает новое имя для существующего столбца.
new_name
Задает новое имя таблицы.
data_type
Указывает тип данных нового столбца или новый тип данных для существующего столбца.
table_constraint
Добавляет новое ограничение таблицы.
constraint_name
Указывает имя нового или существующего ограничения.
CASCADE
Автоматически удаляет объекты, которые зависят от удаленного столбца или ограничения (например, представления, ссылающиеся на этот столбец), и все объекты, зависящие от этих объектов.
RESTRICT
Запрещает удаление столбца или ограничения, если от них зависят другие объекты. Является поведением по умолчанию.
trigger_name
Задает имя одного триггера, который нужно отключить или включить.
ALL
Отключает или включает все триггеры, принадлежащие таблице. Для этого требуется привилегия суперпользователя, если какие-либо из триггеров являются внутренне создаваемыми ограничениями, например, триггеры внешнего ключа или откладываемые ограничения уникальности и исключения.
USER
Отключает или включает все триггеры, принадлежащие таблице, за исключением внутренних триггеров ограничения, таких как те, которые используются для реализации внешних ключей или отложенных ограничений уникальности и исключения.
index_name
Указывает имя существующего индекса.
storage_parameter
Указывает имя параметра хранения таблицы.
value
Задает новое значение параметра хранения таблицы. Это может быть число или строка в зависимости от параметра.
parent_table
Указывает родительскую таблицу для ассоциации или удаления связи с текущей таблицей.
new_owner
Задает имя нового владельца таблицы.
new_access_method
Указывает имя метода доступа, к которому будет приведена таблица.
new_tablespace
Задает имя табличного пространства, в которое будет перемещена таблица.
new_schema
Задает имя схемы, в которую будет перемещена таблица.
partition_name
Задает имя таблицы, которую нужно присоединить как новую партицию или отсоединить от текущей таблицы.
partition_bound_spec
Указывает спецификацию границ партиции для новой партиции. Подробнее о синтаксисе смотрите в описании команды CREATE TABLE.
Примечания
Ключевое слово COLUMN является синтаксическим шумом и может быть опущено.
Когда столбец добавляется с помощью ADD COLUMN и указывается неизменчивое (non-volatile) DEFAULT, значение по умолчанию вычисляется в момент выполнения оператора, а результат сохраняется в метаданных таблицы, откуда он будет возвращаться при обращении к любым существующим строкам. Значение будет применено только при перезаписи таблицы, что делает ALTER TABLE очень быстрым даже на больших таблицах. Если ограничения столбца не указаны, в качестве DEFAULT используется NULL. Ни в одном из этих случаев перезапись таблицы не требуется.
Добавление столбца с изменчивым (volatile) DEFAULT (например, clock_timestamp()), хранимого генерируемого столбца, столбца идентификации или столбца с типом данных домена, имеющего ограничения, приведет к перезаписи всей таблицы и ее индексов. Добавление виртуального генерируемого столбца никогда не требует перезаписи.
Изменение типа существующего столбца обычно приводит к перезаписи всей таблицы и ее индексов. В виде исключения, при изменении типа существующего столбца, если предложение USING не изменяет содержимое столбца и старый тип либо бинарно приводим к новому типу, либо является неограниченным доменом над новым типом, перезапись таблицы не требуется. Однако индексы все равно будут перестроены, если система не сможет проверить, что новый индекс логически эквивалентен существующему. Например, если для столбца было изменено правило сортировки (collation), требуется перестроение индекса, поскольку новый порядок сортировки может отличаться. Однако при отсутствии изменения правила сортировки столбец можно изменить с text на varchar (или наоборот) без перестроения индексов, поскольку эти типы данных сортируются идентично.
Перестроение таблицы и/или индексов может занять значительное время для большой таблицы и временно потребует до двойного объема дискового пространства.
Добавление ограничения CHECK или NOT NULL требует сканирования таблицы для проверки того, что существующие строки соответствуют ограничению, но не требует перезаписи таблицы. Если ограничение CHECK добавляется как NOT ENFORCED, проверка выполняться не будет.
Аналогично, при присоединении нового раздела он может быть просканирован для проверки того, что существующие строки соответствуют ограничению раздела.
Основная причина предоставления возможности указания нескольких изменений в одном ALTER TABLE заключается в том, что несколько сканирований или перезаписей таблицы могут быть таким образом объединены в один проход по таблице.
Сканирование большой таблицы для проверки новых ограничений внешнего ключа, CHECK или NOT NULL может занять много времени, и другие обновления таблицы блокируются до тех пор, пока команда ALTER TABLE ADD CONSTRAINT не будет зафиксирована. Основная цель опции ограничения NOT VALID заключается в снижении влияния добавления ограничения на параллельные обновления. При использовании NOT VALID команда ADD CONSTRAINT не сканирует таблицу и может быть зафиксирована немедленно. После этого может быть выдана команда VALIDATE CONSTRAINT для проверки того, что существующие строки удовлетворяют ограничению. Этап проверки не требует блокировки параллельных обновлений, поскольку система знает, что другие транзакции будут применять ограничение к строкам, которые они вставляют или обновляют; проверять нужно только предсуществующие строки. Следовательно, проверка приобретает только блокировку SHARE UPDATE EXCLUSIVE на изменяемой таблице. (Если ограничение является внешним ключом, то также требуется блокировка ROW SHARE на таблице, на которую ссылается ограничение.) Помимо улучшения параллелизма, может быть полезно использовать NOT VALID и VALIDATE CONSTRAINT в случаях, когда известно, что таблица содержит уже существующие нарушения. После того как ограничение установлено, новые нарушения вставить невозможно, а существующие проблемы могут быть исправлены в спокойном режиме до тех пор, пока VALIDATE CONSTRAINT окончательно не завершится успешно.
Форма DROP COLUMN не удаляет столбец физически, а просто делает его невидимым для SQL-операций. Последующие операции вставки и обновления в таблице будут сохранять значение NULL для этого столбца. Таким образом, удаление столбца выполняется быстро, но это не уменьшит немедленно размер таблицы на диске, поскольку пространство, занятое удаленным столбцом, не освобождается. Пространство будет освобождаться со временем по мере обновления существующих строк.
Для принудительного немедленного освобождения пространства, занятого удаленным столбцом, можно выполнить одну из форм ALTER TABLE, которая выполняет перезапись всей таблицы. Это приводит к перестроению каждой строки с заменой удаленного столбца значением NULL.
Формы перезаписи ALTER TABLE не являются MVCC-безопасными. После перезаписи таблицы таблица будет казаться пустой для параллельных транзакций, если они используют снимок (snapshot), сделанный до перезаписи.
Опция USING предложения SET DATA TYPE на самом деле может указывать любое выражение, включающее старые значения строки; то есть оно может ссылаться на другие столбцы, а также на преобразуемый. Это позволяет выполнять очень общие преобразования с использованием синтаксиса SET DATA TYPE. Из-за этой гибкости выражение USING не применяется к значению по умолчанию столбца (если оно есть); результат может не быть константным выражением, как требуется для значения по умолчанию. Это означает, что когда отсутствует неявное или приведение при присваивании от старого типа к новому, SET DATA TYPE может не выполнить преобразование значения по умолчанию, даже если предложено предложение USING. В таких случаях удалите значение по умолчанию с помощью DROP DEFAULT, выполните ALTER TYPE, а затем используйте SET DEFAULT для добавления подходящего нового значения по умолчанию. Аналогичные соображения применимы к индексам и ограничениям, затрагивающим столбец.
Если таблица имеет какие-либо дочерние таблицы, не разрешается добавлять, переименовывать или изменять тип столбца в родительской таблице без выполнения того же самого для дочерних. Это гарантирует, что дочерние таблицы всегда будут иметь столбцы, соответствующие родительской. Аналогично, ограничение CHECK не может быть переименовано в родительской таблице без переименования его во всех дочерних, чтобы ограничения CHECK также совпадали между родительской таблицей и ее дочерними. (Однако это ограничение не применяется к ограничениям на основе индексов.) Кроме того, поскольку выборка из родительской таблицы также выполняет выборку из ее дочерних, ограничение на родительской таблице не может быть помечено как допустимое (VALID), если оно также не помечено как допустимое для этих дочерних таблиц. Во всех этих случаях ALTER TABLE ONLY будет отклонен.
Рекурсивная операция DROP COLUMN удалит столбец дочерней таблицы только в том случае, если дочерняя таблица не наследует этот столбец от каких-либо других родителей и никогда не имела независимого определения столбца. Нерекурсивный DROP COLUMN (то есть ALTER TABLE ONLY ... DROP COLUMN) никогда не удаляет дочерние столбцы, а вместо этого помечает их как независимо определенные, а не унаследованные. Нерекурсивная команда DROP COLUMN завершится ошибкой для секционированной таблицы, поскольку все разделы таблицы должны иметь те же столбцы, что и корень секционирования.
Действия для столбцов идентификации (ADD GENERATED, SET и так далее, DROP IDENTITY), а также действия CLUSTER, OWNER и TABLESPACE никогда не рекурсируют в дочерние таблицы; то есть они всегда действуют так, как будто указано ONLY. Действия, влияющие на состояния триггеров, рекурсируют в разделы секционированных таблиц (если не указано ONLY), но никогда в дочерние таблицы традиционного наследования. Добавление ограничения рекурсирует только для ограничений CHECK, которые не помечены как NO INHERIT.
Изменение любой части таблицы системного каталога не разрешается.
Для получения дополнительной информации о допустимых параметрах смотрите описание команды CREATE TABLE.
Примеры
Добавление в таблицу столбца типа varchar:
ALTER TABLE distributors ADD COLUMN address varchar(30);
При этом во всех существующих строках таблицы новый столбец получит значение null.
Добавление столбца со значением по умолчанию (отличным от NULL):
ALTER TABLE measurements
ADD COLUMN mtime timestamp with time zone DEFAULT now();
В существующих строках новый столбец будет содержать текущее время, а в добавляемых впоследствии строках — время их добавления.
Добавление столбца и заполнение его значением, отличным от значения по умолчанию, которое будет использоваться в дальнейшем:
ALTER TABLE transactions
ADD COLUMN status varchar(30) DEFAULT 'old',
ALTER COLUMN status SET default 'current';
Существующие строки будут заполнены значением old, но для последующих команд значением по умолчанию будет current. Результат этих двух указаний в одной команде будет таким же, как и при выполнении их в отдельных командах ALTER TABLE.
Удаление столбца из таблицы:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
Изменение типов двух существующих столбцов в одной операции:
ALTER TABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);
Смена типа целочисленного столбца, содержащего время в стиле Unix, на тип timestamp with time zone с применением выражения USING:
ALTER TABLE foo
ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
USING
timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
То же самое, но в случае, когда у столбца есть значение по умолчанию, не приводимое автоматически к новому типу данных:
ALTER TABLE foo
ALTER COLUMN foo_timestamp DROP DEFAULT,
ALTER COLUMN foo_timestamp TYPE timestamp with time zone
USING
timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
ALTER COLUMN foo_timestamp SET DEFAULT now();
Переименование существующего столбца:
ALTER TABLE distributors RENAME COLUMN address TO city;
Переименование существующей таблицы:
ALTER TABLE distributors RENAME TO suppliers;
Переименование существующего ограничения:
ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;
Добавление в столбец ограничения NOT NULL:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
Удаление ограничения NOT NULL из столбца:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
Добавление ограничения проверки в таблицу и всем ее дочерним элементам:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
Добавление ограничения проверки только в таблицу, но не к ее дочерним элементам:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;
Данное ограничение проверка не будет наследоваться будущими дочерними элементами.
Удаление ограничения проверки из таблицы и из всех ее дочерних элементов:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
Удаление ограничения проверки только из самой таблицы:
ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;
Ограничение проверки остается во всех дочерних таблицах.
Добавление в таблицу ограничения внешнего ключа:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);
Добавление в таблицу ограничения внешнего ключа с наименьшим влиянием на работу других:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID;
ALTER TABLE distributors VALIDATE CONSTRAINT distfk;
Добавление в таблицу ограничения уникальности (по нескольким столбцам):
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
Добавление в таблицу первичного ключа с автоматическим именем (учтите, что в таблице может быть только один первичный ключ):
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
Перемещение таблицы в другое табличное пространство:
ALTER TABLE distributors SET TABLESPACE fasttablespace;
Перемещение таблицы в другую схему:
ALTER TABLE myschema.distributors SET SCHEMA yourschema;
Пересоздание ограничения первичного ключа без блокировки изменений в процессе перестроения индекса:
CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;
Присоединение партиции к таблице, партиционируемой по диапазонам:
ALTER TABLE measurement
ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
Присоединение партиции к таблице, партиционируемой по списку:
ALTER TABLE cities
ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');
Присоединение партиции к таблице, партиционируемой по хешу:
ALTER TABLE orders
ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);
Присоединение партиции по умолчанию к партиционированной таблице:
ALTER TABLE cities
ATTACH PARTITION cities_partdef DEFAULT;
Удаление партиции из партиционированной таблицы:
ALTER TABLE measurement
DETACH PARTITION measurement_y2015m12;
Совместимость
Формы ADD (без USING INDEX), DROP [COLUMN], DROP IDENTITY, RESTART, SET DEFAULT, SET DATA TYPE (без USING), SET GENERATED и SET sequence_option соответствуют стандарту SQL. Другие формы являются расширениями стандарта SQL для PostgreSQL. Кроме того, возможность указать более одной манипуляции в одной команде ALTER TABLE является расширением.
ALTER TABLE DROP COLUMN может использоваться для удаления единственного столбца таблицы, оставляя таблицу с нулевыми столбцами. Это расширение SQL, которое запрещает таблицы с нулевым количеством столбцов.