ALTER TABLE
ALTER TABLE — изменить определение таблицы
Синтаксис
ALTER TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
действие [, ... ]
ALTER TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
RENAME [ COLUMN ] имя_столбца TO новое_имя_столбца
ALTER TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
RENAME CONSTRAINT имя_ограничения TO имя_нового_ограничения
ALTER TABLE [ IF EXISTS ] имя
RENAME TO новое_имя
ALTER TABLE [ IF EXISTS ] имя
SET SCHEMA новая_схема
ALTER TABLE ALL IN TABLESPACE имя [ OWNED BY имя_роли [, ... ] ]
SET TABLESPACE новое_табличное_пространство [ NOWAIT ]
ALTER TABLE [ IF EXISTS ] имя
ATTACH PARTITION имя_партиции { FOR VALUES указание_границ_партиции | DEFAULT }
ALTER TABLE [ IF EXISTS ] имя
DETACH PARTITION имя_партиции [ CONCURRENTLY | FINALIZE ]
где действием может быть:
ADD [ COLUMN ] [ IF NOT EXISTS ] имя_столбца тип_данных [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] имя_столбца [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] имя_столбца [ SET DATA ] TYPE тип_данных [ COLLATE правило_сортировки ] [ USING выражение ]
ALTER [ COLUMN ] имя_столбца SET DEFAULT выражение
ALTER [ COLUMN ] имя_столбца DROP DEFAULT
ALTER [ COLUMN ] имя_столбца { SET | DROP } NOT NULL
ALTER [ COLUMN ] имя_столбца DROP EXPRESSION [ IF EXISTS ]
ALTER [ COLUMN ] имя_столбца ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( параметры_последовательности ) ]
ALTER [ COLUMN ] имя_столбца { SET GENERATED { ALWAYS | BY DEFAULT } | SET параметр_последовательности | RESTART [ [ WITH ] перезапуск ] } [...]
ALTER [ COLUMN ] имя_столбца DROP IDENTITY [ IF EXISTS ]
ALTER [ COLUMN ] имя_столбца SET STATISTICS целое_число
ALTER [ COLUMN ] имя_столбца SET ( атрибут = значение [, ... ] )
ALTER [ COLUMN ] имя_столбца RESET ( атрибут [, ... ] )
ALTER [ COLUMN ] имя_столбца SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER [ COLUMN ] имя_столбца SET COMPRESSION метод_сжатия
ADD ограничение_таблицы [ NOT VALID ]
ADD ограничение_таблицы_по_индексу
ALTER CONSTRAINT имя_ограничения [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
VALIDATE CONSTRAINT имя_ограничения
DROP CONSTRAINT [ IF EXISTS ] имя_ограничения [ RESTRICT | CASCADE ]
DISABLE TRIGGER [ имя_триггера | ALL | USER ]
ENABLE TRIGGER [ имя_триггера | ALL | USER ]
ENABLE REPLICA TRIGGER имя_триггера
ENABLE ALWAYS TRIGGER имя_триггера
DISABLE RULE имя_правила_перезаписи
ENABLE RULE имя_правила_перезаписи
ENABLE REPLICA RULE имя_правила_перезаписи
ENABLE ALWAYS RULE имя_правила_перезаписи
DISABLE ROW LEVEL SECURITY
ENABLE ROW LEVEL SECURITY
FORCE ROW LEVEL SECURITY
NO FORCE ROW LEVEL SECURITY
CLUSTER ON имя_индекса
SET WITHOUT CLUSTER
SET WITHOUT OIDS
SET TABLESPACE новое_табличное_пространство
SET { LOGGED | UNLOGGED }
SET ( параметр_хранения [= значение] [, ... ] )
RESET ( параметр_хранения [, ... ] )
INHERIT родительская_таблица
NO INHERIT родительская_таблица
OF имя_типа
NOT OF
OWNER TO { новый_владелец | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
REPLICA IDENTITY { DEFAULT | USING INDEX имя_индекса | FULL | NOTHING }
и указанием_границ_партиции может быть:
IN ( выражение_границ_партиции [, ...] ) |
FROM ( { выражение_границ_партиции | MINVALUE | MAXVALUE } [, ...] )
TO ( { выражение_границ_партиции | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS числовая_константа, REMAINDER числовая_константа )
и ограничением_столбца может быть:
[ CONSTRAINT имя_ограничения ]
{ NOT NULL |
NULL |
CHECK ( выражение ) [ NO INHERIT ] |
DEFAULT выражение_по_умолчанию |
GENERATED ALWAYS AS ( генерирующее_выражение ) STORED |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( параметры_последовательности ) ] |
UNIQUE параметры_индекса |
PRIMARY KEY параметры_индекса |
REFERENCES ссылочная_таблица [ ( ссылочный_столбец ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
и ограничением_таблицы может быть:
[ CONSTRAINT имя_ограничения ]
{ CHECK ( выражение ) [ NO INHERIT ] |
UNIQUE ( имя_столбца [, ... ] ) параметры_индекса |
PRIMARY KEY ( имя_столбца [, ... ] ) параметры_индекса |
EXCLUDE [ USING индексный_метод ] ( элемент_исключения WITH оператор [, ... ] ) параметры_индекса [ WHERE ( предикат ) ] |
FOREIGN KEY ( имя_столбца [, ... ] ) REFERENCES ссылочная_таблица [ ( ссылочный_столбец [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
и ограничением_таблицы_по_индексу может быть:
[ CONSTRAINT имя_ограничения ]
{ UNIQUE | PRIMARY KEY } USING INDEX имя_индекса
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
параметрами_индекса в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE могут быть:
[ INCLUDE ( имя_столбца [, ... ] ) ]
[ WITH ( параметр_хранения [= значение] [, ... ] ) ]
[ USING INDEX TABLESPACE имя_табличного_пространства ]
элементом_исключения в ограничении EXCLUDE может быть:
{ имя_столбца | ( выражение ) } [ класс_операторов ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
Описание
Команда ALTER TABLE
изменяет определение существующей таблицы. Ниже описано
несколько форм команды. Обратите внимание, что требуемый уровень блокировки у
каждой формы может быть свой. Если явно не отмечено другое, требуется блокировка
ACCESS EXCLUSIVE. При указании нескольких подкоманд будет запрашиваться
самая сильная блокировка из требуемых ими.
ADD COLUMN [ IF NOT EXISTS ]
Эта форма добавляет в таблицу новый столбец, используя тот же синтаксис, что и
команда CREATE TABLE
. Если указано IF NOT EXISTS и столбец с таким именем уже
существует, это не будет ошибкой.
DROP COLUMN [ IF EXISTS ]
Эта форма удаляет столбец из таблицы. Связанные со столбцом индексы и ограничения таблицы также будут автоматически удалены. Кроме того, будет удалена обращающаяся к удаляемому столбцу многовариантная статистика, если после его удаления в этой статистике останутся данные только одного столбца. Чтобы удалить какие-либо зависящие от этого столбца объекты вне таблицы, например ссылки на внешние ключи или представления, необходимо добавить в команду указание CASCADE. Если в команде указано IF EXISTS и удаляемый столбец не существует, это не считается ошибкой, вместо этого просто выдается замечание.
SET DATA TYPE
Эта форма изменяет тип столбца таблицы. Включающие данный столбец индексы и простые табличные ограничения будут автоматически преобразованы для использования нового типа столбца путем повторного синтаксического анализа изначально определяющего их выражения. Необязательное предложение OLLATE задает правило сортировки для нового столбца; если оно опущено, для нового типа столбца устанавливается правило сортировки по умолчанию. Необязательное предложение USING определяет, как вычислить новое значение столбца из старого; если оно опущено, по умолчанию преобразование выполняется как присваивание значения старого типа данных новому. Предложение USING становится обязательным, если отсутствует неявное приведение или присвоение от старого к новому типу.
SET/DROP DEFAULT
Эти формы устанавливают или удаляют для столбца значение по умолчанию (где удаление
равнозначно указанию NULL в качестве значения по умолчанию). Новое значение по
умолчанию применяется только в последующих командах INSERT
или UPDATE
, не
вызывая изменений уже существующих в таблице строк.
SET/DROP NOT NULL
Эти формы определяют, будет ли столбец принимать значения NULL или нет.
Указание SET NOT NULL можно применять к столбцу, только если ни одна из
записей в таблице не содержит значение NULL. Как правило, это проверяется во время
выполнения команды ALTER TABLE
и требует сканирования всей таблицы, однако в
случае наличия у столбца ограничения CHECK, которое гарантирует, что значения
NULL отсутствуют, сканирование таблицы пропускается.
Если таблица является партицией, нельзя выполнить DROP NOT NULL, если столбец помечен NOT NULL в родительской таблице. Для снятия ограничения NOT NULL со всех партиций нужно выполнить DROP NOT NULL у родительской таблицы. При этом, если у родительской таблицы отсутствует ограничение NOT NULL, при желании его все же можно добавить к отдельным партициям; то есть потомки могут запретить значения NULL, даже если родитель разрешает их, но не наоборот.
DROP EXPRESSION [ IF EXISTS ]
Эта форма превращает хранимый генерируемый столбец в обычный. Имеющиеся в столбцах данные сохраняются, но будущие изменения больше не будут вноситься генерирующим выражением.
Если указано DROP EXPRESSION 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 параметр_последовательности
RESTART
Эти формы меняют последовательность, лежащую в основе уже существующего столбца
идентификации. Свойство параметр_последовательности поддерживается командой
ALTER SEQUENCE
, например INCREMENT BY.
SET STATISTICS
Эта форма задает целевой показатель статистики по столбцу для последующих операций
ANALYZE
. Значение целевого показателя можно задать в диапазоне от 0 до 10000;
также его можно установить равным -1 для возврата к использованию системного
целевого показателя статистики по умолчанию (default_statistics_target). Более
подробную информацию об использовании статистики планировщиком запросов
QHB см. в разделе Статистика, используемая планировщиком.
SET STATISTICS запрашивает блокировку SHARE UPDATE EXCLUSIVE.
SET ( атрибут = значение [, ... ] )
RESET ( атрибут [, ... ] )
Эта форма устанавливает или сбрасывает параметры для каждого атрибута. В
настоящее время единственными параметрами атрибутов являются n_distinct и
n_distinct_inherited, которые переопределяют оценки количества уникальных
значений, производимые последующими операциями ANALYZE
. n_distinct влияет
на статистику для самой таблицы, тогда как n_distinct_inherited влияет на
статистику, собранную и для таблицы, и для ее потомков. Если установлено
положительное значение, ANALYZE
будет считать, что столбец содержит точно указанное
количество уникальных значений, отличных от NULL. Если установлено отрицательное
значение, которое должно быть больше или равно -1, ANALYZE
будет считать, что
количество уникальных значений, отличных от NULL, в столбце линейно зависит от
размера таблицы; точное число будет вычислено путем умножения расчетного размера
таблицы на абсолютное значение данного числа. Например, значение -1 подразумевает,
что все значения в столбце уникальны, а значение -0,5 — что каждое значение
повторяется в среднем дважды. Это может быть полезно, когда размер таблицы изменяется
с течением времени, так как умножение на количество строк в таблице выполняется
только во время планирования запроса. При указании значения 0 количество уникальных
значений оценивается как обычно. Дополнительную информацию об использовании
статистики планировщиком запросов QHB см. в разделе Статистика, используемая планировщиком.
Для изменения параметров атрибутов запрашивается блокировка SHARE UPDATE EXCLUSIVE.
SET STORAGE
Эта форма задает режим хранения для столбца. Этот параметр определяет, будет ли этот столбец храниться внутри таблицы или в отдельной таблице TOAST, а также следует ли сжимать данные. Режим PLAIN необходимо использовать для значений фиксированной длины, таких как integer; это вариант хранения внутри, без сжатия. Режим MAIN предназначен для хранения внутри, но сжимаемых данных. Режим EXTERNAL предназначен для внешних несжатых данных, а EXTENDED — для внешних сжатых данных. EXTENDED используется по умолчанию для большинства типов данных, которые поддерживают хранение в режиме, отличном от PLAIN. Применение EXTERNAL позволяет ускорить операции с подстроками на очень больших значениях text и bytea за счет проигрыша в объеме хранилища. Обратите внимание, что сам по себе SET STORAGE ничего не меняет в таблице, а лишь задает стратегию, которая будет реализована при последующих изменениях таблицы. Дополнительную информацию см. в разделе TOAST.
SET COMPRESSION метод_сжатия
Эта форма устанавливает метод сжатия для столбца, определяя, как будут сжиматься
добавляемые в будущем значения (если режим хранения вообще допускает сжатие). Это
не вызывает перезапись таблицы, поэтому существующие данные могут оставаться
сжатыми другими методами. Если таблица восстанавливается утилитой pg_restore,
то все значения перезаписываются с применением сконфигурированного метода сжатия.
Однако когда данные добавляются из другого отношения (например командой
INSERT ... SELECT
), значения из исходной таблицы не обязательно будут распакованы,
поэтому все ранее сжатые данные могут сохраниться с уже существующим методом
сжатия, вместо того чтобы пересжиматься методом сжатия, заданным для целевого
столбца. Поддерживаемые методы сжатия: pglz и lz4. (Метод lz4 доступен,
только если при сборке QHB был использован ключ --with-lz4.)
Кроме того, метод_сжатия может принимать значение default, который выбирает
поведение по умолчанию, заключающееся в определении применяемого метода сжатия путем
проверки значения параметра default_toast_compression во время добавления данных.
ADD ограничение_таблицы [ NOT VALID ]
Эта форма добавляет новое ограничение к таблице, используя тот же синтаксис, что
и CREATE TABLE
, плюс параметр NOT VALID, который в настоящее время разрешен
только для ограничений внешнего ключа и проверочных ограничений.
Обычно эта форма вызывает сканирование таблицы с целью проверки, что все существующие строки в таблице удовлетворяют новому ограничению. Но если используется параметр NOT VALID, то это потенциально длительное сканирование пропускается. Ограничение по-прежнему будет применяться к последующим добавлениям или изменениям (то есть они завершатся ошибкой, если при наличии внешнего ключа в ссылочной таблице нет соответствующей строки или если новая строка не соответствует указанному условию проверки). Но база данных не будет считать, что ограничение выполняется для всех строк в таблице, пока оно не будет проверено с помощью VALIDATE CONSTRAIN. Дополнительную информацию об использовании указания NOT VALID см. ниже, в Примечаниях.
Хотя большинству форм ADD ограничение_таблицы нужна блокировка ACCESS EXCLUSIVE, вариант ADD FOREIGN KEY требует только блокировку SHARE ROW EXCLUSIVE. Обратите внимание, что ADD FOREIGN KEY запрашивает эту блокировку как в целевой таблице, так и в таблице, на которую данное ограничение ссылается.
С ограничениями уникальности и первичного ключа, которые добавляются в
партиционированные таблицы, связаны дополнительные требования; см. CREATE TABLE
.
Кроме того, в настоящее время ограничения внешнего ключа для партиционированных
таблиц не могут объявляться как непроверенные (NOT VALID).
ADD ограничение_таблицы_по_индексу
Эта форма добавляет в таблицу новое ограничение PRIMARY KEY или UNIQUE, основанное на существующем уникальном индексе. Все столбцы индекса будут включены в ограничение.
Индекс не может быть частичным и включать столбцы-выражения. Кроме того, это
должен быть индекс В-дерево с порядком сортировки по умолчанию. Эти ограничения
гарантируют, что данный индекс равнозначен тому, который был бы построен обычной
командой ADD PRIMARY KEY
или ADD UNIQUE
.
Если указывается PRIMARY KEY и столбцы индекса еще не помечены как NOT NULL,
то эта команда попытается выполнить ALTER COLUMN SET NOT NULL
для каждого такого
столбца. Это потребует полного сканирования таблицы с целью проверки, что столбцы
не содержат NULL. Во всех остальных случаях это быстрая операция.
Если имя ограничения указано, то индекс будет переименован, чтобы соответствовать имени ограничения. В противном случае ограничение будет называться так же, как индекс.
После выполнения этой команды индекс становится «принадлежащим» ограничению,
аналогично тому, как если бы этот индекс был построен обычной командой ADD PRIMARY KEY
или ADD UNIQUE
. В частности, удаление ограничения приведет к
удалению индекса.
В настоящее время эта форма не поддерживается для партиционированных таблиц.
Примечание
Добавление ограничения с помощью существующего индекса может быть полезно в ситуациях, когда необходимо добавить новое ограничение, не блокируя изменения в таблице в течение длительного времени. Для этого можно создать индекс, используяCREATE INDEX CONCURRENTLY
, а затем задействовать его как полноценное ограничение, используя эту запись. См. пример ниже.
ALTER CONSTRAINT
Эта форма меняет атрибуты созданного ранее ограничения. В настоящее время изменять можно только ограничения внешнего ключа.
VALIDATE CONSTRAINT
Эта форма проверяет ограничение внешнего ключа или проверочное ограничение, которое ранее было создано как NOT VALID, путем сканирования всей таблицы, чтобы убедиться в отсутствии строк, для которых ограничение не выполняется. Если ограничение уже помечено как проверенное, ничего не происходит. (См. параграф Примечания ниже, где объясняется полезность этой команды.)
DROP CONSTRAINT [ IF EXISTS ]
Эта форма удаляет указанное ограничение на таблицу вместе с лежащим в его основе индексом. Если указано IF EXISTS и ограничение не существует, это не считается ошибкой. В этом случае выдается только замечание.
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER
Эти формы настраивают срабатывание принадлежащего таблице триггера (или триггеров). Выключенный триггер сохраняется в системе, но не выполняется, когда происходит его запускающее событие. Для отложенного триггера состояние включения проверяется при наступлении события, а не при фактическом выполнении триггерной функции. Можно выключить или включить один триггер, указанный по имени, или все триггеры в таблице, или только пользовательские триггеры (этот параметр исключает внутрисистемные триггеры ограничений, например используемые для реализации ограничений внешнего ключа или отложенных ограничений уникальности и исключения). Выключение или включение сгенерированных внутрисистемных триггеров ограничений требует прав суперпользователя; выключение следует делать с осторожностью, так как, разумеется, при невыполнении триггеров нельзя гарантировать целостность ограничения.
На механизм срабатывания триггера также влияет переменная конфигурации session_replication_role. Включенные без дополнительных указаний триггеры (по умолчанию) будут срабатывать, когда ролью репликации является «origin» (по умолчанию) или «local». Триггеры, настроенные с указанием ENABLE REPLICA, будут срабатывать только в том случае, если сеанс находится в режиме «replica», а триггеры, настроенные с указанием ENABLE ALWAYS, будут запущены независимо от текущего режима репликации.
Действие этого механизма заключается в том, что в конфигурации по умолчанию триггеры не срабатывают на репликах. Это полезно, так как если триггер используется в исходной базе для распространения данных между таблицами, то система репликации также будет реплицировать и распределенные данные, и триггер не должен срабатывать во второй раз на реплике, потому что это приведет к дублированию. Однако если триггер используется для другой цели, например для создания внешних оповещений, то его можно задать равным ENABLE ALWAYS, чтобы он срабатывал и в репликах.
Эта команда запрашивает блокировку 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 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 ( параметр_хранения = значение [, ... ] )
Эта форма изменяет один или несколько параметров хранения таблицы. Подробную
информацию о доступных параметрах см. в параграфе Параметры хранения на
справочной странице команды CREATE TABLE
. Обратите внимание, что содержимое
таблицы этой командой не будет изменено немедленно; в зависимости от параметра
для получения желаемого эффекта может потребоваться переписать таблицы. Это можно
сделать с помощью команд VACUUM FULL
, CLUSTER
или одной из форм
ALTER TABLE
, которая принудительно перезаписывает таблицу. Изменения параметров,
связанных с планировщиком, вступят в силу при следующей блокировке таблицы,
поэтому запросы, выполняемые в данный момент, затронуты не будут.
Данная форма запрашивает блокировку SHARE UPDATE EXCLUSIVE для изменения параметров хранения, связанных с коэффициентом заполнения, TOAST и автоочисткой, а также параметра планировщика parallel_workers.
RESET ( параметр_хранения [, ... ] )
Эта форма сбрасывает один или несколько параметров хранения до значений по умолчанию. Как и в случае с SET, для полного обновления таблицы может потребоваться ее перезапись.
INHERIT таблица_родитель
Эта форма добавляет целевую таблицу в качестве нового потомка указанной родительской таблицы. Впоследствии запросы к родительской таблице будут включать записи целевой таблицы. Чтобы стать потомком, целевая таблица уже должна содержать те же столбцы, что и родительская (она также может содержать и дополнительные столбцы). Данные столбцы должны иметь соответствующие типы данных, и если они имеют ограничения NOT NULL в родителе, то должны иметь их и в потомке.
Кроме того, в дочерней таблице должны присутствовать все ограничения CHECK
родительской таблицы, за исключением помеченных как ненаследуемые (т. е. созданных
с помощью команды ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT
), которые
игнорируются; все соответствующие ограничения дочерней таблицы не должны быть
помечены как ненаследуемые. В настоящий момент ограничения UNIQUE, PRIMARY
KEY и FOREIGN KE не учитываются, но в будущем это может измениться.
NO INHERIT таблица_родитель
Эта форма удаляет целевую таблицу из списка потомков указанной родительской таблицы. Запросы к родительской таблице больше не будут включать записи, полученные из целевой таблицы.
OF имя_типа
Эта форма связывает таблицу с составным типом, как если бы таблица была сформирована
командой CREATE TABLE OF
. Список имен и типов столбцов таблицы должен точно
соответствовать списку составного типа. Таблица не должна быть потомком другой
таблицы. Эти ограничения гарантируют, что CREATE TABLE OF
позволит создать
таблицу с аналогичным определением.
NOT OF
Эта форма отделяет типизированную таблицу от ее типа.
OWNER TO
Эта форма меняет владельца таблицы, последовательности, представления, материализованного представления или сторонней таблицы на указанного пользователя.
REPLICA IDENTITY
Эта форма изменяет информацию, которая записывается в журнал упреждающей записи для идентификации изменяемых или удаляемых строк. В большинстве случаев старые значения всех столбцов протоколируются, только если они отличаются от новых значений; однако если старое значение хранится отдельно, оно протоколируется всегда, независимо от того, было ли оно изменено. Этот параметр действует только при использовании логической репликации.
-
DEFAULT
Записывает старые значения столбцов первичного ключа, если таковые имеются. Это режим по умолчанию для несистемных таблиц. -
USING INDEX имя_индекса
Записывает старые значения столбцов, покрываемых именованным индексом, который должен быть уникальным, не частичным, не отложенным и должен включать только столбцы, помеченные как NOT NULL. При удалении этого индекса поведение будет аналогично режиму NOTHING. -
FULL
Записывает старые значения всех столбцов в данной строке. -
NOTHING
Не записывает никакой информации о старой строке. Это режим по умолчанию для системных таблиц.
RENAME
Формы RENAME изменяют имя таблицы (или индекса, последовательности, представления, материализованного представления или сторонней таблицы), имя отдельного столбца в таблице или имя ограничения таблицы. При переименовании ограничения, имеющего нижележащий индекс, этот индекс также переименовывается. При этом на хранимые данные это не влияет.
SET SCHEMA
Эта форма перемещает таблицу в другую схему. Связанные индексы, ограничения и последовательности, принадлежащие столбцам таблицы, также перемещаются.
ATTACH PARTITION имя_партиции { FOR VALUES указание_границ_партиции | DEFAULT }
Эта форма присоединяет существующую таблицу (которая сама может быть
партиционирована) в качестве партиции к целевой таблице. Таблица может быть
присоединена в качестве партиции для конкретных значений с помощью FOR VALUES
или в качестве партиции по умолчанию с помощью DEFAULT. Для каждого индекса в
целевой таблице будет создан соответствующий индекс в присоединенной таблице, или,
если аналогичный индекс уже существует, он будет присоединен к индексу целевой
таблицы, как при выполнении команды ALTER INDEX ATTACH PARTITION
. Обратите
внимание, что если существующая таблица является сторонней, то в настоящее время
ее нельзя присоединить в качестве партиции целевой таблицы, если в целевой таблице
есть индексы UNIQUE (уникальные). (См. также CREATE FOREIGN TABLE
.) Для
каждого пользовательского триггера уровня строк, существующего в целевой таблице,
будет создан соответствующий триггер в присоединенной таблице.
Для партиции, добавляемой с FOR VALUES, используется то же синтаксис
указание_границ_партиции, что и в CREATE TABLE
. Указание границы партиции
должно соответствовать стратегии партиционирования и ключу разбиения целевой
таблицы. Присоединяемая таблица должна содержать те же столбцы, что и целевая, и
никаких других; более того, типы столбцов тоже должны совпадать. Кроме того,
присоединяемая таблица должна иметь все ограничения NOT NULL и CHECK
целевой таблицы. В настоящий момент ограничения FOREIGN KEY не рассматриваются.
Если ограничения UNIQUE и PRIMARY KEY еще не существуют в партиции, они
будут созданы в ней из родительской таблицы. Если какое-либо из ограничений
CHECK присоединяемой таблицы помечено как NO INHERIT, команда выдаст
ошибку; такие ограничения должны быть пересозданы без предложения NO INHERIT.
Если новая партиция является обычной таблицей, выполняется ее полное сканирование, чтобы убедиться, что существующие в этой таблице строки не нарушают ограничение партиции. Этого сканирования можно избежать, перед выполнением этой команды добавив в таблицу допустимое ограничение CHECK, позволяющее использовать только строки, удовлетворяющие требуемому ограничению партиции. Ограничение CHECK будет использоваться для определения того, что таблицу не нужно сканировать с целью проверки ограничения партиции. Однако это не работает, если какой-либо из ключей разбиения является выражением и партиция не принимает значения NULL. При присоединении партиции, не принимающей значения NULL, по списку также добавьте ограничение NOT NULL в столбец ключа разбиения, если это не выражение.
Если новая партиция является сторонней таблицей, то проверка того, подчиняются ли
все строки в сторонней таблице ограничению партиции, не выполняется. (См.
описание ограничений сторонней таблицы на справочной странице команды
CREATE FOREIGN TABLE
.)
Если таблица имеет партицию по умолчанию, добавление новой партиции изменяет ограничение партиции по умолчанию. Партиция по умолчанию не может содержать строк, которые может понадобиться переместить в новую партицию, поэтому она будет просканирована и проверена на предмет их отсутствия. Этого сканирования, как и сканирования новой партиции, можно избежать, если имеется подходящее ограничение CHECK. Кроме того, как и сканирование новой партиции, оно всегда пропускается, когда партиция по умолчанию является сторонней таблицей.
Для присоединения партиции наряду с блокировками ACCESS EXCLUSIVE в присоединяемых таблицах и партиции по умолчанию (при наличии) запрашивается блокировка SHARE UPDATE EXCLUSIVE в родительской таблице.
Дополнительные блокировки должны также устанавливаться во всех вложенных партициях, если присоединяемая таблица либо партиция по умолчанию сама является партиционированной. Блокировки вложенных партиций можно избежать, добавив ограничение CHECK, как описано в подразделе Обслуживание партиций.
DETACH PARTITION имя_партиции [ CONCURRENTLY | FINALIZE ]
Эта форма отсоединяет указанную партицию целевой таблицы. Отсоединенная партиция продолжает существовать как отдельная таблица, но больше не имеет никаких связей с таблицей, от которой была отсоединена. Все индексы, присоединенные к индексам целевой таблицы, отсоединяются. Все триггеры, созданные как клоны триггеров целевой таблицы, удаляются. Все таблицы, ссылающиеся на эту партиционированную таблицу в ограничениях внешнего ключа, получают блокировку SHARE.
Если указано CONCURRENTLY, эта операция выполняется с пониженным уровнем блокировок во избежание блокирования других сеансов, которые могут обращаться к этой партиционированной таблице. В этом режиме внутренне используются две транзакции. Во время первой транзакции в родительской таблице и партиции устанавливается блокировка SHARE UPDATE EXCLUSIVE, а партиция помечается как отсоединяемая; в этот момент транзакция фиксируется, и все остальные транзакции, использующие партиционированную таблицу, ждут этого. Как только все эти транзакции завершаются, вторая транзакция получает блокировку SHARE UPDATE EXCLUSIVE для партиционированной таблицы и ACCESS EXCLUSIVE для партиции, после чего процесс отсоединения завершается. Режим CONCURRENTLY нельзя запускать в блоке транзакции, а кроме того, он не допускается, если партиционированная таблица содержит партицию по умолчанию.
Если указано FINALIZE, завершается предыдущий вызов DETACH CONCURRENTLY,
который был отменен или прерван. Отсоединять от партиционированной таблицы можно
максимум одну партицию за раз.
.
Все формы ALTER TABLE
, которые действуют на одну таблицу, за исключением
RENAME, SET SCHEMA, ATTACH PARTITION и DETACH PARTITION, можно
объединить в список из нескольких изменений, которые будут применяться вместе.
Например, можно добавить несколько столбцов и/или изменить тип нескольких столбцов
в одной команде. Это особенно полезно с большими таблицами, поскольку вся таблица
обрабатывается за один проход.
Чтобы использовать команду ALTER TABLE
, нужно быть владельцем соответствующей
таблицы. Чтобы изменить схему или табличное пространство таблицы, необходимо помимо
этого иметь право CREATE в новой схеме или табличном пространстве. Чтобы добавить
таблицу в качестве нового потомка родительской таблицы, нужно также быть владельцем
родительской таблицы. Кроме того, чтобы присоединить таблицу в качестве новой
партиции таблицы, нужно быть владельцем присоединяемой таблицы. Для смены владельца
текущий пользователь также должен быть непосредственным или опосредованным членом
новой роли-владельца, и эта роль должна иметь право CREATE в схеме таблицы.
(Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего,
что нельзя было бы сделать путем удаления и повторного создания таблицы.
Однако суперпользователь все равно может сменить владельца любой таблицы.)
Чтобы добавить столбец, сменить тип столбца или применить предложение OF,
необходимо помимо этого иметь право USAGE для соответствующего типа данных.
Параметры
IF EXISTS
Не считать ошибкой, если таблица не существует. В этом случае выдается только замечание.
имя
Имя изменяемой существующей таблицы (может быть дополнено схемой). Если перед именем таблицы указывается ONLY, изменяется только эта таблица. Если ONLY не указано, изменяются и сама таблица, и все ее потомки (если таковые имеются). После имени таблицы можно также добавить необязательное указание *, чтобы явно обозначить, что изменению подлежат все дочерние таблицы.
имя_столбца
Имя нового или существующего столбца.
новое_имя_столбца
Новое имя существующего столбца.
новое_имя
Новое имя таблицы.
тип_данных
Тип данных нового столбца или новый тип данных для существующего столбца.
ограничение_таблицы
Новое ограничение таблицы.
имя_ограничения
Имя нового или существующего ограничения.
CASCADE
Автоматически удалить объекты, зависящие от удаляемого столбца или ограничения (например представления, ссылающиеся на столбец), и, в свою очередь, все объекты, зависящие от этих объектов (см. раздел Отслеживание зависимостей).
RESTRICT
Запретить удаление столбца или ограничения, если существуют зависящие от них объекты. Это поведение по умолчанию.
имя_триггера
Имя триггера, который нужно выключить или включить.
ALL
Выключить или включить все принадлежащие таблице триггеры. (Если в числе этих триггеров оказываются сгенерированные внутрисистемные триггеры исключений, например, используемые для реализации ограничений внешнего ключа или отложенных ограничений уникальности и исключения, то для этого потребуются права суперпользователя.)
USER
Выключить или включить все принадлежащие таблице триггеры, за исключением сгенерированных внутрисистемных триггеров исключений, например используемых для реализации ограничений внешнего ключа или отложенных ограничений уникальности и исключения.
имя_индекса
Имя существующего индекса.
параметр_хранения
Имя параметра хранения таблицы.
значение
Новое значение для параметра хранения таблицы. В зависимости от параметра, это может быть число или строка.
родительская_таблица
Родительская таблица для присоединения или отсоединения этой таблицы.
новый_владелец
Имя пользователя нового владельца этой таблицы.
новое_табличное_пространство
Имя табличного пространства, в которое будет перемещена эта таблица.
новая_схема
Имя схемы, в которую будет перемещена эта таблица.
имя_партиции
Имя таблицы, присоединяемой в качестве новой партиции или, наоборот, отсоединяемой от данной таблицы.
указание_границ_партиции
Указание границ для новой партиции. Более подробную информацию о синтаксисе этого
указания см. на справочной странице команды CREATE TABLE
.
Примечания
Ключевое слово COLUMN не несет смысловой нагрузки, и его можно опустить.
Когда столбец добавляется с помощью ADD COLUMN и задано неизменчивое выражение DEFAULT, значение по умолчанию вычисляется во время выполнения команды, и результат сохраняется в метаданных таблицы. Это значение будет использоваться для столбца во всех существующих строках. Если указание DEFAULT отсутствует, используется значение NULL. Ни в том, ни в другом случае переписывать таблицу не требуется.
Добавление столбца с изменчивым выражением DEFAULT или изменение типа существующего столбца потребует перезаписи всей таблицы и ее индексов. Исключение: если указание USING не изменяет содержимое столбца и старый тип двоично приводится к новому или является неограниченным доменом поверх нового типа, то при изменении типа существующего столбца перезапись таблицы не требуется, но все индексы на затронутых столбцах все равно должны быть перестроены. Перестройка большой таблицы и/или ее индекса может занять длительное время; при этом временно потребуется вдвое больше места на диске.
Добавление ограничений CHECK или NOT NULL требует сканирования таблицы, чтобы убедиться, что существующие строки соответствуют ограничению, но не требует перезаписи таблицы.
Аналогично при присоединении новой партиции та может быть просканирована, чтобы убедиться, что существующие строки соответствуют ограничению партиции.
Основная причина предоставления возможности указать несколько изменений в одной
команде ALTER TABLE
заключается в том, что это позволяет совместить требуемые
этим операциям сканирования и перезаписи таблицы и выполнить их за один проход.
Сканирование большой таблицы для проверки нового внешнего ключа или проверочного
ограничения может занять много времени, и другие изменения таблицы блокируются
до тех пор, пока не будет зафиксирована команда ALTER TABLE ADD CONSTRAINT
.
Основное предназначение указания NOT VALID при добавлении ограничения состоит
в уменьшении влияния этой операции на параллельные изменения данных. С указанием
NOT VALID команда ADD CONSTRAINT
не сканирует таблицу и может быть немедленно
зафиксирована. После этого можно выполнить команду VALIDATE CONSTRAINT
, чтобы
проверить, что существующие строки удовлетворяют ограничению. Эта команда не будет
препятствовать параллельным изменениям, так как ей известно, что в других
транзакциях уже будет действовать ограничение для добавляемых или изменяемых строк;
проверить нужно только уже существующие строки. Следовательно, проверка запрашивает
на изменяемую таблицу только блокировку SHARE UPDATE EXCLUSIVE. (Если это
ограничение внешнего ключа, то в ссылочной таблице данного ограничения также
требуется блокировка ROW SHARE.) Помимо оптимизации параллелизма может быть
полезно использовать указания NOT VALID и VALIDATE CONSTRAINT в тех
случаях, когда заведомо известно, что таблица содержит строки, нарушающие
ограничения. После создания ограничения добавить новые недопустимые строки будет
невозможно, а все существующие проблемы могут разрешаться в свободное время, пока
VALIDATE CONSTRAINT наконец не будет успешно завершена.
Форма DROP COLUMN не удаляет столбец физически, а просто делает его невидимым для операций SQL. Последующие операции добавления и обновления в таблице будут сохранять для столбца значение NULL. Как следствие, удаление столбца выполняется быстро, но не приводит к немедленному уменьшению размера таблицы на диске, поскольку пространство, занимаемое удаляемым столбцом, не восстанавливается. Пространство будет освобождаться с течением времени по мере изменения существующих строк.
Чтобы принудительно освободить место, занимаемое удаляемым столбцом, можно
выполнить одну из форм ALTER TABLE
, которая выполняет перезапись всей таблицы.
Это приведет к воссозданию всех строк с заменой удаленного столбца значением NULL.
Перезаписывающие формы ALTER TABLE
небезопасны с точки зрения MVCC. После
перезаписи таблицы та будет казаться пустой для параллельных транзакций, если они
используют снимок, сделанный до этого события. Более подробную информацию см. в
разделе Ограничения применимости.
В параметре USING предложения SET DATA TYPE действительно можно указать любое выражение, включающее старые значения строки; то есть он может обращаться к другим столбцы, а не только к преобразуемому. Это позволяет с помощью синтаксиса SET DATA TYPE выполнять очень общие преобразования. Из-за этой гибкости выражение USING не применяется к значению столбца по умолчанию (если таковое имеется); результат может не быть константным выражением, как это требуется для значения по умолчанию. Это означает, что при отсутствии неявного приведения или присвоения от старого к новому типу SET DATA TYPE, возможно, не удастся преобразовать значение по умолчанию, даже если указано USING. В таких случаях нужно удалить значение по умолчанию с помощью DROP DEFAULT, выполнить ALTER TYPE, а затем использовать SET DEFAULT, чтобы добавить подходящее новое значение по умолчанию. Аналогичные рекомендации применимы к связанным со столбцом индексам и ограничениям.
Если таблица имеет дочерние таблицы, то не разрешается добавлять, переименовывать
или изменять тип столбца в родительской таблице, не делая то же самое для потомков.
Это гарантирует, что у потомков столбцы всегда соответствуют родительским. Точно
так же нельзя переименовать ограничение CHECK в родительской таблице, не
переименовывая его во всех дочерних таблицах, что тоже гарантирует соответствие
всех ограничений CHECK между родителем и потомком. (Однако этот запрет не
распространяется на ограничения, основанные на индексах.) Кроме того, поскольку
выборка из родительской таблицы также отбирает из ее потомков, ограничение на
родителе не может быть помечено как действующее, если оно не помечено как
действующее для ее потомков. Во всех этих случаях команда ALTER TABLE ONLY
выполнена не будет.
Рекурсивная операция DROP COLUMN удаляет столбец дочерней таблицы только в том
случае, если та не унаследовала данный столбец от каких-то других родителей и
никогда не имела независимое определение столбца. Нерекурсивная операция
DROP COLUMN (т. е. ALTER TABLE ONLY ... DROP COLUMN
) никогда не удаляет
унаследованные столбцы, а вместо этого помечает их как независимо определенные, а
не унаследованные. С партиционированной таблицей нерекурсивная команда DROP COLUMN
выдаст ошибку, так как все партиции таблицы должны содержать те же столбцы,
что и главная таблица.
Действия для столбцов идентификации (ADD GENERATED, SET и т. д., DROP IDENTITY), а также действия TRIGGER, CLUSTER, OWNER и TABLESPACE никогда не распространяются рекурсивно на дочерние таблицы; иначе говоря, они всегда действуют так, будто указано 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 параметр_последовательности соответствуют стандарту SQL. Другие формы
являются расширениями стандарта SQL, реализованными в QHB.
Кроме того, возможность указать несколько операций изменения в одной команде
ALTER TABLE
тоже является расширением.
Команда ALTER TABLE DROP COLUMN
позволяет удалить единственный столбец таблицы,
оставляя ее без столбцов. Это расширение стандарта SQL, который не допускает
таблицы без столбцов.