ALTER TABLE#

ALTER TABLE

ALTER TABLE

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 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
    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
    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 ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

referential_action in a FOREIGN KEY/REFERENCES constraint is:

{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }

Описание

ALTER TABLE изменяет определение существующей таблицы. Ниже описаны несколько подформ. Обратите внимание, что уровень блокировки, необходимый для каждой подформы, может отличаться. Если явно не указано, будет получена блокировка ACCESS EXCLUSIVE. При указании нескольких подкоманд будет получена самая строгая блокировка, необходимая для любой из подкоманд.

ADD COLUMN [ IF NOT EXISTS ] #

Эта форма добавляет новый столбец в таблицу, используя тот же синтаксис, что и CREATE TABLE. Если указано IF NOT EXISTS и столбец с таким именем уже существует, то ошибка не возникает.

DROP COLUMN [ IF EXISTS ] #

Эта форма удаляет столбец из таблицы. Индексы и ограничения таблицы, связанные с этим столбцом, также будут автоматически удалены. Многомерная статистика, ссылающаяся на удаляемый столбец, также будет удалена, если удаление столбца приведет к тому, что статистика будет содержать данные только для одного столбца. Если что-то вне таблицы зависит от столбца, например, ссылки на внешние ключи или представления, необходимо указать CASCADE. Если указана опция IF EXISTS и столбец не существует, не будет сгенерирована ошибка. В этом случае будет выдано уведомление.

SET DATA TYPE #

Эта форма изменяет тип столбца таблицы. Индексы и простые ограничения таблицы, связанные со столбцом, будут автоматически преобразованы для использования нового типа столбца путем повторного анализа исходно предоставленного выражения. Необязательное предложение COLLATE указывает правило сортировки для нового столбца; если не указана, правило сортировки будет установлено по умолчанию для нового типа столбца. Необязательное предложение USING указывает, как вычислить новое значение столбца из старого; если не указана, преобразование по умолчанию будет таким же, как присваивание старого типа данных новому. Предложение USING должно быть указано, если нет неявного или присваиваемого преобразования от старого к новому типу.

Когда используется этот формат, статистика столбца удаляется, поэтому рекомендуется запустить ANALYZE на таблице после этого.

SET/DROP DEFAULT #

Эти формы устанавливают или удаляют значение по умолчанию для столбца (где удаление эквивалентно установке значения по умолчанию в NULL). Новое значение по умолчанию будет применяться только в последующих командах INSERT или UPDATE; оно не приводит к изменению строк, уже находящихся в таблице.

SET/DROP NOT NULL #

Эти формы изменяются в зависимости от того, отмечен ли столбец для разрешения значений 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 sequence_option
RESTART #

Эти формы изменяют последовательность, которая лежит в основе существующего идентификационного столбца. sequence_option - это опция, поддерживаемая ALTER SEQUENCE, такая как INCREMENT BY.

SET STATISTICS #

Эта форма устанавливает целевое значение сбора статистики для каждого столбца для последующих операций ANALYZE. Целевое значение может быть установлено в диапазоне от 0 до 10000; альтернативно, установите его в -1, чтобы вернуться к использованию системного значения целевой статистики по умолчанию (default_statistics_target). Для получения дополнительной информации о использовании статистики планировщиком запросов Tantor BE, см. Раздел 14.2.

SET STATISTICS приобретает блокировку 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, чтобы вернуться к нормальной оценке количества уникальных значений. Дополнительную информацию о использовании статистики планировщиком запросов Tantor BE см. в разделе Раздел 14.2.

Изменение параметров для каждого атрибута требует получения блокировки SHARE UPDATE EXCLUSIVE.

SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } #

Эта форма устанавливает режим хранения для столбца. Это контролирует, будет ли этот столбец храниться в строке или в дополнительной таблице TOAST, и должны ли данные сжиматься или нет. PLAIN должен использоваться для значений фиксированной длины, таких как integer, и хранится в строке, несжатым. MAIN предназначен для сжимаемых данных, хранящихся в строке. EXTERNAL предназначен для внешних, несжатых данных, а EXTENDED — для внешних, сжатых данных. Запись DEFAULT устанавливает режим хранения по умолчанию для типа данных столбца. EXTENDED является режимом по умолчанию для большинства типов данных, поддерживающих не-PLAIN хранение. Использование EXTERNAL ускорит операции с подстроками на очень больших значениях text и bytea, за счет увеличения объема хранимых данных. Обратите внимание, что ALTER TABLE ... SET STORAGE само по себе ничего не изменяет в таблице; оно просто устанавливает стратегию, которой следует придерживаться при будущих обновлениях таблицы. См. Раздел 70.2 для получения дополнительной информации.

SET COMPRESSION compression_method #

Эта форма устанавливает метод сжатия для столбца, определяя, как будут сжиматься значения, вставленные в будущем (если режим хранения позволяет сжатие вообще). Это не приводит к перезаписи таблицы, поэтому существующие данные могут быть сжаты другими методами сжатия. Если таблица восстанавливается с помощью pg_restore, то все значения перезаписываются с настроенным методом сжатия. Однако, когда данные вставляются из другой таблицы (например, с помощью INSERT ... SELECT), значения из исходной таблицы не обязательно разжимаются, поэтому любые ранее сжатые данные могут сохранить свой существующий метод сжатия, а не быть сжатыми с помощью метода сжатия целевого столбца. Поддерживаемые методы сжатия - pglz и lz4. (lz4 доступен только если при сборке Tantor BE использовалась опция --with-lz4). Кроме того, compression_method может быть default, что выбирает поведение по умолчанию, при котором при вставке данных консультируется настройка default_toast_compression, чтобы определить метод использования.

ADD table_constraint [ NOT VALID ] #

Эта форма добавляет новое ограничение к таблице, используя ту же синтаксическую конструкцию ограничений, что и CREATE TABLE, плюс опцию NOT VALID, которая в настоящее время разрешена только для внешних ключей и ограничений CHECK.

Обычно, эта форма приведет к сканированию таблицы для проверки того, что все существующие строки в таблице удовлетворяют новому ограничению. Но если используется опция NOT VALID, это потенциально длительное сканирование пропускается. Ограничение все равно будет применяться к последующим вставкам или обновлениям (то есть они не будут выполнены, если в целевой таблице нет соответствующей строки в случае внешних ключей, или они не будут выполнены, если новая строка не соответствует указанному условию проверки). Но база данных не будет предполагать, что ограничение выполняется для всех строк в таблице, пока оно не будет проверено с использованием опции VALIDATE CONSTRAINT. См. раздел Notes ниже для получения дополнительной информации об использовании опции 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 к таблице на основе существующего уникального индекса. Все столбцы индекса будут включены в ограничение.

Индекс не может иметь столбцы с выражениями и не может быть частичным индексом. Кроме того, он должен быть индексом b-tree с порядком сортировки по умолчанию. Эти ограничения гарантируют, что индекс эквивалентен тому, который будет создан с помощью обычной команды 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, путем сканирования таблицы для проверки отсутствия строк, для которых ограничение не выполняется. Ничего не происходит, если ограничение уже помечено как допустимое. (См. Notes ниже для объяснения полезности этой команды).

Эта команда получает блокировку 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 #

Эта форма изменяет метод доступа к таблице путем его перезаписи. См. Глава 60 для получения дополнительной информации.

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] [, ... ] ) #

Эта форма изменяет один или несколько параметров хранения для таблицы. См. Storage Parameters в документации по CREATE TABLE для получения подробной информации о доступных параметрах. Обратите внимание, что содержимое таблицы не будет немедленно изменено этой командой; в зависимости от параметра, вам может потребоваться перезаписать таблицу, чтобы получить желаемый эффект. Это можно сделать с помощью VACUUM FULL, CLUSTER или одной из форм ALTER TABLE, которая принудительно перезаписывает таблицу. Для параметров, связанных с планировщиком, изменения вступят в силу с момента блокировки таблицы, поэтому текущие выполняющиеся запросы не будут затронуты.

Блокировка SHARE UPDATE EXCLUSIVE будет применена для параметров fillfactor, toast и autovacuum хранилища, а также для параметра планировщика parallel_workers.

RESET ( storage_parameter [, ... ] ) #

Эта форма сбрасывает один или несколько параметров хранения на их значения по умолчанию. Как и в случае с SET, может потребоваться перезапись таблицы для полного обновления таблицы.

INHERIT parent_table #

Эта форма добавляет целевую таблицу в качестве нового дочернего элемента указанной родительской таблицы. В дальнейшем запросы к родительской таблице будут включать записи из целевой таблицы. Чтобы быть добавленной в качестве дочерней, целевая таблица должна уже содержать все те же столбцы, что и родительская таблица (она также может иметь дополнительные столбцы). Столбцы должны иметь совпадающие типы данных, и если они имеют ограничения NOT NULL в родительской таблице, то они также должны иметь ограничения NOT NULL в дочерней таблице.

Необходимо также иметь соответствующие дочерние ограничения таблицы для всех ограничений CHECK родительской таблицы, за исключением тех, которые помечены как непередаваемые (то есть созданные с помощью ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT) в родительской таблице, которые игнорируются; все соответствующие дочерние ограничения таблицы не должны быть помечены как непередаваемые. В настоящее время ограничения UNIQUE, PRIMARY KEY и FOREIGN KEY не учитываются, но это может измениться в будущем.

NO INHERIT parent_table #

Эта форма удаляет целевую таблицу из списка дочерних таблиц указанной родительской таблицы. Запросы к родительской таблице больше не будут включать записи из целевой таблицы.

OF type_name #

Эта форма связывает таблицу с составным типом, как если бы CREATE TABLE OF его создал. Список имен и типов столбцов таблицы должен точно соответствовать составному типу. Таблица не должна наследоваться от другой таблицы. Эти ограничения гарантируют, что CREATE TABLE OF позволит создать эквивалентное определение таблицы.

NOT OF #

Эта форма отделяет типизированную таблицу от ее типа.

OWNER TO #

Эта форма изменяет владельца таблицы, последовательности, представления, материализованного представления или внешней таблицы на указанного пользователя.

REPLICA IDENTITY #

Эта форма изменяет информацию, которая записывается в журнал предварительной записи, чтобы идентифицировать обновленные или удаленные строки. В большинстве случаев старое значение каждого столбца записывается в журнал только в том случае, если оно отличается от нового значения; однако, если старое значение хранится внешне, оно всегда записывается в журнал независимо от того, изменилось ли оно. Эта опция не имеет эффекта, если не используется логическая репликация.

DEFAULT #

Записывает старые значения столбцов первичного ключа, если они есть. Это значение по умолчанию для таблиц, не являющихся системными.

USING INDEX index_name #

Записывает старые значения столбцов, покрытых именованным индексом, который должен быть уникальным, нечастичным, неотложным и включать только столбцы, помеченные NOT NULL. Если этот индекс удаляется, поведение такое же, как NOTHING.

FULL #

Записывает старые значения всех столбцов в строке.

NOTHING #

Записи не содержат информации о старой строке. Это значение по умолчанию для системных таблиц.

RENAME #

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

SET SCHEMA #

Эта форма перемещает таблицу в другую схему. Связанные индексы, ограничения и последовательности, принадлежащие столбцам таблицы, также перемещаются.

ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT } #

Эта форма присоединяет существующую таблицу (которая сама может быть разделена) к целевой таблице в качестве секции. Таблица может быть присоединена как секция для конкретных значений, используя FOR VALUES, или как секция по умолчанию, используя DEFAULT. Для каждого индекса в целевой таблице будет создан соответствующий индекс в присоединенной таблице; или, если уже существует эквивалентный индекс, он будет присоединен к индексу целевой таблицы, как если бы была выполнена команда ALTER INDEX ATTACH PARTITION. Обратите внимание, что если существующая таблица является внешней таблицей, в настоящее время нельзя присоединить таблицу в качестве секции целевой таблицы, если на целевой таблице есть UNIQUE индексы. (См. также CREATE FOREIGN TABLE). Для каждого определенного пользователем триггера на уровне строки, существующего в целевой таблице, будет создан соответствующий.

Раздел, использующий FOR VALUES, использует тот же синтаксис для partition_bound_spec, что и CREATE TABLE. Спецификация границы раздела должна соответствовать стратегии разделения и ключу раздела целевой таблицы. Таблица, которую необходимо присоединить, должна иметь все те же столбцы, что и целевая таблица, и не больше; более того, типы столбцов также должны совпадать. Также она должна иметь все ограничения NOT NULL и CHECK целевой таблицы, не помеченные как NO INHERIT. В настоящее время ограничения FOREIGN KEY не учитываются. Ограничения UNIQUE и PRIMARY KEY из родительской таблицы будут созданы в разделе, если они еще не существуют.

Если новая секция является обычной таблицей, выполняется полное сканирование таблицы для проверки того, что существующие строки в таблице не нарушают ограничение секционирования. Возможно избежать этого сканирования, добавив допустимое ограничение CHECK к таблице, которое позволяет только строкам, удовлетворяющим требуемому ограничению секционирования, перед выполнением этой команды. Ограничение CHECK будет использоваться для определения того, что таблицу не нужно сканировать для проверки ограничения секционирования. Однако это не работает, если один из ключей разделения является выражением, и секционирование не принимает значения NULL. Если добавляется список секций, который не принимает значения NULL, также добавьте ограничение NOT NULL к столбцу ключа разделения, если только это не выражение.

Если новая секция является внешней таблицей, не выполняется никаких проверок на то, что все строки во внешней таблице соответствуют ограничениям секционирования. (См. обсуждение в CREATE FOREIGN TABLE об ограничениях на внешней таблице).

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

Прикрепление секции приобретает блокировку SHARE UPDATE EXCLUSIVE на родительской таблице, в дополнение к блокировкам ACCESS EXCLUSIVE на таблице, к которой прикрепляется секция, и на секции по умолчанию (если она есть).

Дополнительные блокировки также должны быть удерживаемыми на всех подсекциях, если таблица, к которой прикрепляется, является сама по себе секционированной таблицей. То же верно, если секция по умолчанию является сама по себе секционированной таблицей. Блокировку подсекций можно избежать путем добавления ограничения CHECK, как описано в Раздел 5.11.2.2.

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, могут быть объединены в список нескольких изменений, которые будут применены вместе. Например, возможно добавить несколько столбцов и/или изменить тип нескольких столбцов в одной команде. Это особенно полезно при работе с большими таблицами, так как требуется только один проход по таблице.

Вы должны быть владельцем таблицы, чтобы использовать ALTER TABLE. Чтобы изменить схему или таблицу пространства, вы также должны иметь привилегию CREATE на новую схему или таблицу пространства. Чтобы добавить таблицу как нового потомка родительской таблицы, вы также должны владеть родительской таблицей. Также, чтобы присоединить таблицу как новую секцию таблицы, вы должны владеть присоединяемой таблицей. Чтобы изменить владельца, вы должны иметь возможность использовать SET ROLE для новой роли владельца, и эта роль должна иметь привилегию CREATE на схему таблицы. (Эти ограничения обеспечивают, что изменение владельца не делает ничего, чего вы не могли бы сделать, удалив и воссоздав таблицу. Однако суперпользователь может изменить владельца любой таблицы в любом случае.) Чтобы добавить столбец или изменить тип столбца или использовать предложение OF, вы также должны иметь привилегию USAGE на тип данных.

Параметры

IF EXISTS #

Не генерировать ошибку, если таблица не существует. В этом случае будет выдано уведомление.

name #

Имя (опционально с указанием схемы) существующей таблицы для изменения. Если перед именем таблицы указано ONLY, изменяется только эта таблица. Если ONLY не указано, изменяется таблица и все ее наследники (если они есть). Дополнительно, после имени таблицы можно указать *, чтобы явно указать, что включены наследники таблицы.

column_name #

Имя нового или существующего столбца.

new_column_name #

Новое имя для существующей колонки.

new_name #

Новое имя для таблицы.

data_type #

Тип данных нового столбца или новый тип данных для существующего столбца.

table_constraint #

Новое ограничение таблицы для таблицы.

constraint_name #

Имя нового или существующего ограничения.

CASCADE #

Автоматически удалять объекты, зависящие от удаленного столбца или ограничения (например, представления, ссылающиеся на столбец), а также все объекты, зависящие от этих объектов (см. Раздел 5.14).

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, значение по умолчанию вычисляется во время выполнения оператора и результат сохраняется в метаданных таблицы. Это значение будет использоваться для столбца для всех существующих строк. Если не указано значение DEFAULT, используется значение NULL. В обоих случаях не требуется перезапись таблицы.

Добавление столбца с волатильным значением DEFAULT или изменение типа существующего столбца потребует перезаписи всей таблицы и ее индексов. Исключение составляет изменение типа существующего столбца: если USING не изменяет содержимое столбца, а старый тип либо является бинарно приводимым к новому типу, либо является неограниченным доменом над новым типом, перезапись таблицы не требуется. Однако индексы всегда должны быть перестроены, если система не может подтвердить, что новый индекс будет логически эквивалентен существующему. Например, если изменено правило сортировки для столбца, всегда требуется перестройка индекса, потому что новый порядок сортировки может отличаться. Однако, если изменение касается только правила сортировки, столбец может быть изменен с типа text на varchar (и наоборот) без перестройки индексов, так как эти типы данных сортируются идентично. Перестройка таблицы и/или индексов может занять значительное время для больших таблиц и временно потребовать в два раза больше дискового пространства.

Добавление ограничения 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 операций. Последующие операции вставки и обновления в таблице будут сохранять пустое значение для столбца. Таким образом, удаление столбца происходит быстро, но это не сразу уменьшает размер таблицы на диске, так как место, занимаемое удаленным столбцом, не освобождается. Место будет возвращено со временем при обновлении существующих строк.

Чтобы принудительно освободить пространство, занимаемое удаленным столбцом, вы можете выполнить одну из форм команды ALTER TABLE, которая выполняет перестроение всей таблицы. Это приводит к восстановлению каждой строки с удаленным столбцом, замененным на значение null.

Варианты перезаписи команды ALTER TABLE не являются безопасными для MVCC. После перезаписи таблицы, она будет пустой для параллельных транзакций, если они используют снимок, сделанный до перезаписи. Дополнительные сведения см. в разделе Раздел 13.6.

Опция 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), а также действия CLUSTER, OWNER, и TABLESPACE никогда не применяются к дочерним таблицам; то есть, они всегда действуют так, как если бы было указано ONLY. Действия, влияющие на состояния триггеров, распространяются на секции секционированных таблиц (если не указано ONLY), но никогда на наследников традиционного наследования. Добавление ограничения распространяется только на ограничения CHECK которые не помечены как NO INHERIT.

Изменение любой части таблицы системного каталога запрещено.

Ссылка на CREATE TABLE содержит дополнительное описание допустимых параметров. Глава 5 содержит дополнительную информацию о наследовании.

Примеры

Чтобы добавить столбец типа 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);

Для перемещения таблицы в другое табличнoe пространствo:

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. Другие формы являются расширениями Tantor BE стандарта SQL. Кроме того, возможность указать более одной операции в одной команде ALTER TABLE является расширением.

ALTER TABLE DROP COLUMN может быть использовано для удаления единственного столбца таблицы, оставляя таблицу без столбцов. Это расширение SQL, которое запрещает таблицы без столбцов.

См. также

CREATE TABLE