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 ]
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 |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) STORED |
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 ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
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 ) } [ opclass ] [ 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.
SET
/DROP DEFAULT
- Устанавливают или удаляют значение по умолчанию для столбца. Удаление аналогично установке значения по умолчанию
NULL
. Новое значение будет использоваться только при будущих операцияхINSERT
илиUPDATE
. Уже существующие строки в таблице не изменяются.
SET
/DROP NOT NULL
- Управляют разрешением или запретом значений
NULL
в столбце.SET NOT NULL
можно применить только в том случае, если ни одна строка в таблице не содержитNULL
в этом столбце. Обычно это проверяется путем полного сканирования таблицы. Но, если в таблице уже есть ограничениеCHECK
, которое доказывает невозможность наличияNULL
, проверка может быть пропущена.В случае партиционированных таблиц, нельзя удалить ограничение
NOT NULL
у дочерней партиции, если оно установлено в родительской таблице. Чтобы удалитьNOT NULL
во всех партициях, сначала нужно удалить его в родительской таблице. При этом, даже если в родителе нетNOT NULL
, такое ограничение все равно может быть задано в дочерних таблицах.
SET EXPRESSION AS
- Эта форма заменяет выражение сгенерированного столбца. Существующие данные в столбце переписываются, и при всех будущих изменениях будет применяться выражение нового поколения.
DROP EXPRESSION [ IF EXISTS ]
- Превращает сгенерированный столбец в обычный. Данные в столбце сохраняются, но дальнейшие изменения в таблице не будут применять выражение генерации.
Если указано
IF EXISTS
, но столбец не является сгенерированным, ошибка не возникает — будет выдано уведомление.
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]
- Изменяют свойства идентификационного столбца или превращают обычный столбец в таковой. Смотрите CREATE TABLE для получения подробной информации. Такие изменения, как и
SET DEFAULT
, применяются только к будущимINSERT
иUPDATE
. Существующие строки не затрагиваются.Если указан
DROP IDENTITY IF EXISTS
, а столбец не является идентификационным, будет выдано уведомление вместо ошибки.
SET sequence_option
RESTART
- Позволяют изменить параметры последовательности, используемой идентификационным столбцом. Можно задавать любые параметры, поддерживаемые в 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
учитывает также данные, унаследованные от дочерних таблиц (в случае использования наследования).Если установить положительное значение,
ANALYZE
будет считать, что столбец содержит точно указанное число различных ненулевых значений.Если установить отрицательное значение (не менее -1),
ANALYZE
будет считать, что количество уникальных ненулевых значений пропорционально размеру таблицы. Конкретное значение будет рассчитано как произведение оценочного размера таблицы на абсолютную величину указанного числа. Например, значение:- -1 означает, что все значения в столбце уникальны.
- -0.5 означает, что каждое значение встречается в среднем дважды.
Это поведение особенно полезно, если размер таблицы со временем меняется, так как вычисление уникальности будет отложено до момента планирования запроса. Чтобы вернуть поведение к обычной оценке уникальности, укажите значение 0.
Изменение параметров столбца требует блокировки уровня
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). Также на данный момент нельзя указывать
NOT VALID
для внешних ключей в партиционированных таблицах.
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
- Изменяет свойства ранее созданного ограничения. В настоящее время могут быть изменены только ограничения внешнего ключа.
VALIDATE CONSTRAINT
- Проверяет ограничение внешнего ключа или
CHECK
, которое ранее было создано сNOT VALID
, путем сканирования таблицы и подтверждения, что нет строк, нарушающих ограничение. Если ограничение уже считается проверенным (VALID), ничего не происходит. Смотрите примечания ниже для объяснения, когда и зачем использовать эту команду.Команда требует блокировки
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
родительской таблицы (за исключением помеченных как не наследуемые, то есть созданных сALTER TABLE ... ADD CONSTRAINT ... NO INHERIT
) должны быть соответствующие ограничения в дочерней таблице. Все соответствующие ограничения в дочерней таблице не должны быть помечены как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
— записывает старые значения столбцов первичного ключа, если он есть. Это значение используется по умолчанию для несистемных таблиц.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
и указывается неизменчивое значение по умолчанию (DEFAULT
), это значение вычисляется в момент выполнения оператора и сохраняется в метаданных таблицы. Это значение будет использовано для всех существующих строк в таблице. Если значение по умолчанию не указано, используется NULL
. В обоих случаях переписывание таблицы не требуется.
Добавление столбца с изменчивым значением по умолчанию или изменение типа существующего столбца потребует переписывания всей таблицы и ее индексов. Однако есть исключение: при изменении типа существующего столбца, если выражение USING
не изменяет содержимое столбца, а старый тип либо может быть двоично приведен к новому, либо является неограниченным доменом над новым типом, то переписывание таблицы не требуется. Индексы всегда необходимо перестроить, если только система не может гарантировать, что новый индекс будет логически эквивалентен существующему. Например, если изменяется правило сортировки столбца, перестроение индекса всегда требуется, так как новый порядок сортировки может отличаться. Но, если правило сортировки не меняется, столбец можно изменить с text
на varchar
(или наоборот) без перестроения индексов, потому что эти типы данных сортируются одинаково. Перестроение таблиц и/или индексов может занять значительное время для больших таблиц и временно потребовать вдвое больше дискового пространства.
Добавление ограничения CHECK
или NOT NULL
требует сканирования таблицы для проверки, соответствуют ли существующие строки новому ограничению, но переписывание таблицы при этом не требуется.
Аналогично, при присоединении новой партиции таблица может быть просканирована для проверки соблюдения партиционного ограничения.
Основной причиной, по которой предусмотрена возможность указания нескольких изменений в одной команде ALTER TABLE
, является возможность объединить множественные проходы по таблице в один.
Сканирование большой таблицы для проверки нового внешнего ключа или ограничения CHECK
может занять много времени, при этом остальные операции обновления таблицы блокируются до тех пор, пока команда 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-операций. Последующие команды INSERT
и UPDATE
будут сохранять NULL
в этом столбце. Таким образом, удаление столбца происходит быстро, но не приводит к немедленному уменьшению размера таблицы на диске, поскольку занимаемое удаленным столбцом пространство не освобождается. Оно будет постепенно освобождаться по мере обновления строк таблицы.
Чтобы принудительно освободить пространство, занимаемое удаленным столбцом, можно выполнить одну из форм ALTER TABLE
, требующую переписывания всей таблицы. Это приведет к пересборке каждой строки с заменой удаленного столбца значением NULL
.
Формы ALTER TABLE
, которые переписывают таблицу, не являются безопасными с точки зрения MVCC
. После переписывания таблицы она будет казаться пустой для параллельных транзакций, если они используют снимок, сделанный до начала переписи.
Параметр USING
команды SET DATA TYPE
может фактически содержать любое выражение, использующее старые значения строки, то есть, оно может ссылаться не только на изменяемый столбец, но и на другие столбцы таблицы. Это позволяет выполнять довольно общие преобразования с помощью SET DATA TYPE
. Из-за такой гибкости выражение USING
не применяется к значению по умолчанию столбца (если оно задано), Результат может не быть константным выражением, как требуется для значений по умолчанию. Это означает, что при отсутствии неявного или присваиваемого приведения типов SET DATA TYPE
может не суметь преобразовать значение по умолчанию, даже если указано выражение USING
. В таких случаях сначала удалите значение по умолчанию с помощью DROP DEFAULT
, затем выполните ALTER TYPE
, и только потом установите новое значение по умолчанию с помощью SET DEFAULT
. Аналогичные соображения применимы к индексам и ограничениям, связанным со столбцом.
Если таблица имеет дочерние таблицы, то не допускается добавлять, переименовывать или изменять тип столбца в родительской таблице без выполнения тех же операций в дочерних таблицах. Это необходимо, чтобы дочерние таблицы всегда имели такие же столбцы, как родительская. Аналогично, ограничение CHECK
нельзя переименовать в родительской таблице, не переименовав его также во всех дочерних таблицах, чтобы ограничения совпадали. Это ограничение не относится к индексным ограничениям. Кроме того, поскольку выборка из родительской таблицы включает данные дочерних таблиц, ограничение в родительской таблице не может быть помечено как допустимое (VALID
), если оно не считается допустимым также во всех дочерних таблицах. Во всех этих случаях команда ALTER TABLE ONLY
будет отклонена.
Рекурсивное удаление столбца DROP COLUMN
приведет к удалению столбца из дочерней таблицы только в том случае, если дочерняя таблица не наследует этот столбец от других родительских таблиц и не имеет собственной независимой версии этого столбца. Нерекурсивная форма (ALTER TABLE ONLY ... 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, которое запрещает таблицы с нулевым количеством столбцов.