Перейти к основному содержимому

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, которое запрещает таблицы с нулевым количеством столбцов.

Смотрите также

CREATE TABLE