ALTER TABLE#
ALTER TABLE
ALTER TABLE — изменить определение таблицы
Синтаксис
ALTER TABLE [ IF EXISTS ] [ ONLY ]name
[ * ]action
[, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME [ COLUMN ]column_name
TOnew_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME CONSTRAINTconstraint_name
TOnew_constraint_name
ALTER TABLE [ IF EXISTS ]name
RENAME TOnew_name
ALTER TABLE [ IF EXISTS ]name
SET SCHEMAnew_schema
ALTER TABLE ALL IN TABLESPACEname
[ OWNED BYrole_name
[, ... ] ] SET TABLESPACEnew_tablespace
[ NOWAIT ] ALTER TABLE [ IF EXISTS ]name
ATTACH PARTITIONpartition_name
{ FOR VALUESpartition_bound_spec
| DEFAULT } ALTER TABLE [ IF EXISTS ]name
DETACH PARTITIONpartition_name
[ CONCURRENTLY | FINALIZE ] whereaction
is one of: ADD [ COLUMN ] [ IF NOT EXISTS ]column_name
data_type
[ COLLATEcollation
] [column_constraint
[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] [ USINGexpression
] ALTER [ COLUMN ]column_name
SET DEFAULTexpression
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 } | SETsequence_option
| RESTART [ [ WITH ]restart
] } [...] ALTER [ COLUMN ]column_name
DROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ]column_name
SET STATISTICSinteger
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 COMPRESSIONcompression_method
ADDtable_constraint
[ NOT VALID ] ADDtable_constraint_using_index
ALTER CONSTRAINTconstraint_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] VALIDATE CONSTRAINTconstraint_name
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_name
ENABLE ALWAYS TRIGGERtrigger_name
DISABLE RULErewrite_rule_name
ENABLE RULErewrite_rule_name
ENABLE REPLICA RULErewrite_rule_name
ENABLE ALWAYS RULErewrite_rule_name
DISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ONindex_name
SET WITHOUT CLUSTER SET WITHOUT OIDS SET ACCESS METHODnew_access_method
SET TABLESPACEnew_tablespace
SET { LOGGED | UNLOGGED } SET (storage_parameter
[=value
] [, ... ] ) RESET (storage_parameter
[, ... ] ) INHERITparent_table
NO INHERITparent_table
OFtype_name
NOT OF OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEXindex_name
| FULL | NOTHING } andpartition_bound_spec
is: IN (partition_bound_expr
[, ...] ) | FROM ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSnumeric_literal
, REMAINDERnumeric_literal
) andcolumn_constraint
is: [ CONSTRAINTconstraint_name
] { NOT NULL | NULL | CHECK (expression
) [ NO INHERIT ] | DEFAULTdefault_expr
| GENERATED ALWAYS AS (generation_expr
) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (sequence_options
) ] | UNIQUE [ NULLS [ NOT ] DISTINCT ]index_parameters
| PRIMARY KEYindex_parameters
| REFERENCESreftable
[ (refcolumn
) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEreferential_action
] [ ON UPDATEreferential_action
] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] andtable_constraint
is: [ CONSTRAINTconstraint_name
] { CHECK (expression
) [ NO INHERIT ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] (column_name
[, ... ] )index_parameters
| PRIMARY KEY (column_name
[, ... ] )index_parameters
| EXCLUDE [ USINGindex_method
] (exclude_element
WITHoperator
[, ... ] )index_parameters
[ WHERE (predicate
) ] | FOREIGN KEY (column_name
[, ... ] ) REFERENCESreftable
[ (refcolumn
[, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEreferential_action
] [ ON UPDATEreferential_action
] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] andtable_constraint_using_index
is: [ CONSTRAINTconstraint_name
] { UNIQUE | PRIMARY KEY } USING INDEXindex_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]index_parameters
inUNIQUE
,PRIMARY KEY
, andEXCLUDE
constraints are: [ INCLUDE (column_name
[, ... ] ) ] [ WITH (storage_parameter
[=value
] [, ... ] ) ] [ USING INDEX TABLESPACEtablespace_name
]exclude_element
in anEXCLUDE
constraint is: {column_name
| (expression
) } [ COLLATEcollation
] [opclass
[ (opclass_parameter
=value
[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]referential_action
in aFOREIGN 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 VALUESpartition_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
соответствуют стандарту SQL. Другие формы являются расширениями
Tantor BE стандарта SQL.
Кроме того, возможность указать более одной операции в одной
команде sequence_option
ALTER TABLE
является расширением.
ALTER TABLE DROP COLUMN
может быть использовано для удаления единственного столбца таблицы, оставляя таблицу без столбцов. Это расширение SQL, которое запрещает таблицы без столбцов.