ALTER TABLE — изменение определения таблицы
ALTER TABLE [ IF EXISTS ] [ ONLY ]name[ * ]action[, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ]name[ * ] RENAME [ COLUMN ]column_nameTOnew_column_nameALTER TABLE [ IF EXISTS ] [ ONLY ]name[ * ] RENAME CONSTRAINTconstraint_nameTOnew_constraint_nameALTER TABLE [ IF EXISTS ]nameRENAME TOnew_nameALTER TABLE [ IF EXISTS ]nameSET SCHEMAnew_schemaALTER TABLE ALL IN TABLESPACEname[ OWNED BYrole_name[, ... ] ] SET TABLESPACEnew_tablespace[ NOWAIT ] ALTER TABLE [ IF EXISTS ]nameATTACH PARTITIONpartition_name{ FOR VALUESpartition_bound_spec| DEFAULT } ALTER TABLE [ IF EXISTS ]nameDETACH PARTITIONpartition_name[ CONCURRENTLY | FINALIZE ] гдеactionпринимает одно из следующих значений: ADD [ COLUMN ] [ IF NOT EXISTS ]column_namedata_type[ COLLATEправило_сортировки] [column_constraint[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name[ SET DATA ] TYPEdata_type[ COLLATEправило_сортировки] [ USINGexpression] ALTER [ COLUMN ]column_nameSET DEFAULTexpressionALTER [ COLUMN ]column_nameDROP DEFAULT ALTER [ COLUMN ]column_name{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_nameSET EXPRESSION AS (expression) ALTER [ COLUMN ]column_nameDROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ]column_nameADD 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_nameDROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ]column_nameSET STATISTICS {integer| DEFAULT } ALTER [ COLUMN ]column_nameSET (attribute_option=value[, ... ] ) ALTER [ COLUMN ]column_nameRESET (attribute_option[, ... ] ) ALTER [ COLUMN ]column_nameSET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]column_nameSET COMPRESSIONcompression_methodADDtable_constraint[ NOT VALID ] ADDtable_constraint_using_indexALTER CONSTRAINTconstraint_name[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] VALIDATE CONSTRAINTconstraint_nameDROP CONSTRAINT [ IF EXISTS ]constraint_name[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name| ALL | USER ] ENABLE TRIGGER [trigger_name| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_nameENABLE ALWAYS TRIGGERtrigger_nameDISABLE RULErewrite_rule_nameENABLE RULErewrite_rule_nameENABLE REPLICA RULErewrite_rule_nameENABLE ALWAYS RULErewrite_rule_nameDISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ONindex_nameSET WITHOUT CLUSTER SET WITHOUT OIDS SET ACCESS METHOD {new_access_method| DEFAULT } SET TABLESPACEnew_tablespaceSET { LOGGED | UNLOGGED } SET (storage_parameter[=value] [, ... ] ) RESET (storage_parameter[, ... ] ) INHERITparent_tableNO INHERITparent_tableOFtype_nameNOT OF OWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEXindex_name| FULL | NOTHING } иpartition_bound_specимеет вид: IN (partition_bound_expr[, ...] ) | FROM ( {partition_bound_expr| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSnumeric_literal, REMAINDERnumeric_literal) иcolumn_constraintимеет вид: [ 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 ] ( {column_name| (expression) } [, ... ] )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 ] иtable_constraintимеет вид: [ CONSTRAINTconstraint_name] { CHECK (expression) [ NO INHERIT ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] (column_name[, ... ] )index_parameters| PRIMARY KEY (column_name[, ... ] )index_parameters| EXCLUDE [ USINGindex_method] (exclude_elementWITHoperator[, ... ] )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 ] иtable_constraint_using_indexимеет вид: [ CONSTRAINTconstraint_name] { UNIQUE | PRIMARY KEY } USING INDEXindex_name[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]index_parametersвUNIQUE,PRIMARY KEY, иEXCLUDEограничениями являются: [ INCLUDE (column_name[, ... ] ) ] [ WITH (storage_parameter[=value] [, ... ] ) ] [ USING INDEX TABLESPACEtablespace_name]exclude_elementвEXCLUDEограничением является: {column_name| (expression) } [ COLLATEправило_сортировки] [opclass[ (opclass_parameter=value[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]referential_actionвFOREIGN KEY/REFERENCESограничением является: { 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.
SET NOT NULL может быть применено к столбцу только при условии, что ни одна из записей в таблице не содержит
NULL значение в данном столбце. Обычно это проверяется в процессе выполнения ALTER TABLE путём сканирования всей таблицы; однако, если найдено действующее CHECK ограничение,
которое подтверждает, что ни одно NULL не может существовать, сканирование таблицы пропускается.
Если данная таблица является секцией, невозможно выполнить DROP NOT NULL
для столбца, если он помечен как NOT NULL в родительской
таблице. Чтобы удалить NOT NULL ограничение из всех секций, выполните DROP NOT NULL в родительской
таблице. Даже если NOT NULL ограничение в родительской таблице отсутствует, при необходимости его можно добавить для отдельных секций; то есть дочерние таблицы могут запрещать значения NULL, даже если родительская таблица их разрешает, но не наоборот.
SET EXPRESSION AS #Эта форма заменяет выражение генерируемого столбца. Существующие данные в столбце перезаписываются, и ко всем будущим изменениям будет применяться новое выражение генерации.
DROP EXPRESSION [ IF EXISTS ] #Эта форма преобразует хранимый генерируемый столбец в обычный базовый столбец. Существующие данные в столбцах сохраняются, но к будущим изменениям выражение генерации применяться больше не будет.
Если DROP EXPRESSION IF EXISTS указано и столбец не является хранимым генерируемым столбцом, ошибка не выдается. В этом случае вместо нее выводится уведомление.
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITYSET GENERATED { ALWAYS | BY DEFAULT }DROP IDENTITY [ IF EXISTS ] #
Эти формы позволяют сделать столбец столбцом идентификации или изменить атрибут генерации существующего столбца идентификации. См. CREATE TABLE для получения подробных сведений.
Как и SET DEFAULT, эти формы влияют только на поведение последующих INSERT
и UPDATE командах; они не приводят к изменению строк, уже существующих в таблице.
Если DROP IDENTITY IF EXISTS указано, а столбец не является столбцом идентификации, ошибка не генерируется. В этом случае вместо этого выводится уведомление.
SET sequence_optionRESTART #
Эти формы изменяют последовательность, лежащую в основе существующего столбца идентификации. sequence_option является параметром,
поддерживаемым ALTER SEQUENCE такими
как INCREMENT BY.
SET STATISTICS #
Эта форма
устанавливает целевое значение сбора статистики по столбцам для последующих
ANALYZE операций.
Целевое значение может быть задано в диапазоне от 0 до 10000. Установите его
в DEFAULT для возврата к использованию системного целевого значения
статистики по умолчанию (default_statistics_target). (Установка значения -1 является устаревшим способом записи для получения того же результата.) Для получения дополнительной информации об использовании статистики
Digital Q.DataBase планировщиком запросов см.
Раздел 2.11.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, чтобы вернуться к стандартному способу оценки количества уникальных значений. Для получения дополнительной информации об использовании статистики Digital Q.DataBase планировщик
запросов, см. Раздел 2.11.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 сама по себе
не изменяет ничего в таблице; она лишь задаёт стратегию, которая будет применяться
при будущих обновлениях таблицы.
См. Раздел 7.15.2 для получения дополнительной информации.
SET COMPRESSION compression_method
#
Эта форма задаёт метод сжатия для столбца, определяя, как будут сжиматься вставляемые в будущем значения (если режим хранения вообще допускает сжатие). Это не приводит к перезаписи таблицы, поэтому существующие данные могут оставаться сжатыми с использованием других методов. Если таблица восстанавливается
с помощью pg_restore, то все значения перезаписываются
с использованием настроенного метода сжатия.
Однако при вставке данных из другого отношения (например,
с помощью INSERT ... SELECT), значения из исходной таблицы не обязательно подвергаются распаковке (detoasted), поэтому любые ранее сжатые данные могут сохранять существующий метод сжатия вместо пересжатия с использованием метода целевого столбца. Поддерживаемыми методами сжатия являются pglz и lz4.
(lz4 доступен только в том случае, если --with-lz4
использовался при сборке Digital Q.DataBase.) Кроме того, compression_method
может быть default, который выбирает поведение по умолчанию, заключающееся в обращении к default_toast_compression настройке в момент вставки данных для определения используемого метода.
ADD table_constraint [ NOT VALID ] #
Эта форма добавляет в таблицу новое ограничение, используя тот же синтаксис, что и CREATE TABLE, плюс параметр NOT VALID, что в настоящее время разрешено только для внешних ключей и ограничений CHECK.
Особенностью реализации UNIQUE ограничения в
Digital Q.DataBase является возможность определения
уникальности не только на основе значения в столбце, но и на основе выражения
над значением столбца. Например:
ALTER TABLE reference ADD CONSTRAINT reference_cost_constraint UNIQUE (abs(cost));
Обычно эта форма вызывает сканирование таблицы для проверки того, что все существующие строки в таблице удовлетворяют новому ограничению. Но если NOT VALID используется, это потенциально длительное сканирование пропускается. Ограничение по-прежнему будет применяться к последующим операциям вставки или обновления (то есть они завершатся ошибкой, если в ссылочной таблице отсутствует соответствующая строка в случае внешних ключей или если новая строка не соответствует заданному условию проверки). Однако база данных не будет считать, что ограничение соблюдается для всех строк в таблице, пока оно не будет подтверждено с помощью VALIDATE
CONSTRAINT параметра.
См. раздел Notes ниже для получения дополнительной информации
об использовании NOT VALID параметра.
Хотя большинство форм ADD
требуют блокировки table_constraintACCESS EXCLUSIVE 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
command.
Если PRIMARY KEY указано, а столбцы индекса еще не помечены как NOT NULL, то эта команда попытается выполнить ALTER COLUMN SET NOT NULL для каждого такого столбца. Это требует полного сканирования таблицы для проверки отсутствия значений NULL в столбцах. Во всех остальных случаях это быстрая операция.
Если указано имя ограничения, индекс будет переименован в соответствии с именем ограничения. В противном случае ограничению будет присвоено то же имя, что и индексу.
После выполнения этой команды индекс становится «подчиненным» ограничению так же, как если бы он был создан обычной командой ADD PRIMARY KEY или ADD UNIQUE
command. В частности, при удалении ограничения будет автоматически удален и индекс.
Эта форма в настоящее время не поддерживается для секционированных таблиц.
Добавление ограничения с использованием существующего индекса может быть полезно в
ситуациях, когда необходимо добавить новое ограничение без длительной блокировки
обновлений таблицы. Для этого создайте индекс с помощью команды
CREATE UNIQUE INDEX CONCURRENTLY, а затем преобразуйте его в
ограничение, используя данный синтаксис. См. пример ниже.
ALTER CONSTRAINT #Данная форма изменяет атрибуты ранее созданного ограничения. В настоящее время поддерживается изменение только ограничений внешнего ключа.
VALIDATE CONSTRAINT #
Данная форма проверяет ограничение внешнего ключа или ограничение CHECK, которое было ранее создано как 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 будут
срабатывать независимо от текущей роли репликации.
Действие этого механизма заключается в том, что при конфигурации по умолчанию триггеры не срабатывают на репликах. Это целесообразно, так как если триггер используется на источнике (origin) для копирования данных между таблицами, то система репликации также реплицирует эти скопированные данные; следовательно, триггер не должен срабатывать повторно на реплике, поскольку это приведет к дублированию. Однако если триггер используется для иных целей,
таких как создание внешних уведомлений, может быть целесообразно перевести его
в состояние ENABLE ALWAYS чтобы он также срабатывал на
репликах.
При применении этой команды к секционированной таблице состояния соответствующих клонированных триггеров в секциях также обновляются, если только не ONLY указано.
Данная команда запрашивает SHARE ROW EXCLUSIVE блокировку.
DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE #
Данные формы настраивают срабатывание правил перезаписи, относящихся к таблице.
Отключенное правило остается известным системе, но не применяется
в процессе перезаписи запросов. Семантика аналогична правилам для отключенных/включенных триггеров. Данная конфигурация игнорируется для ON SELECT правил, которые применяются всегда для обеспечения работоспособности представлений, даже если текущий сеанс использует роль репликации, отличную от установленной по умолчанию.
На механизм срабатывания правил также влияет конфигурационная переменная session_replication_role, аналогично триггерам, как описано выше.
DISABLE/ENABLE ROW LEVEL SECURITY #
Данные формы управляют применением политик защиты строк (RLS), относящихся к таблице. Если этот режим включен и для таблицы не задано ни одной политики, применяется политика запрета по умолчанию (default-deny). Обратите внимание, что политики могут существовать для таблицы даже в том случае, если защита на уровне строк отключена. В этом случае политики будут
не будут применены, а политики будут проигнорированы.
См. также
CREATE POLICY.
NO FORCE/FORCE ROW LEVEL SECURITY #
Данные формы управляют применением политик защиты строк, принадлежащих таблице, в тех случаях, когда пользователем является владелец таблицы. Если данный режим включен, политики защиты на уровне строк будут применяться и в том случае, когда пользователем является владелец таблицы. Если
режим отключен (по умолчанию), защита на уровне строк не будет применяться,
когда пользователем является владелец таблицы.
См. также
CREATE POLICY.
CLUSTER ON #
Данная форма выбирает индекс по умолчанию для будущих
CLUSTER
операций. При этом фактическая перекластеризация таблицы не производится.
Изменение параметров кластеризации запрашивает SHARE UPDATE EXCLUSIVE блокировку.
SET WITHOUT CLUSTER #
Данная форма удаляет спецификацию последнего использованного
CLUSTER
индекса из таблицы. Это влияет на будущие операции кластеризации, в которых индекс не указан явным образом.
Изменение параметров кластеризации запрашивает SHARE UPDATE EXCLUSIVE блокировку.
SET WITHOUT OIDS #
Обратно совместимый синтаксис для удаления oid
системного столбца. Поскольку oid системные столбцы больше нельзя добавлять, это действие никогда не имеет эффекта.
SET ACCESS METHOD #
Данная форма изменяет метод доступа таблицы, перезаписывая её с использованием указанного метода доступа; указание
DEFAULT выбирает метод доступа, установленный в качестве
default_table_access_method параметра
конфигурации.
См. Глава 7.11 для получения дополнительной информации.
При применении к секционированной таблице данные не перезаписываются, но секции, созданные впоследствии, будут по умолчанию использовать заданный метод доступа, если он не переопределен предложением USING clause.
Указание DEFAULT удаляет предыдущее значение,
в результате чего будущие секции будут по умолчанию использовать
default_table_access_method.
SET TABLESPACE #
Эта форма изменяет табличное пространство таблицы на указанное и перемещает файлы данных, связанные с таблицей, в новое табличное пространство. Индексы таблицы, если они есть, не перемещаются; но их можно переместить
отдельно с помощью дополнительных SET TABLESPACE команд.
При применении к секционированной таблице фактического перемещения данных не происходит, однако любые
секции, создаваемые в дальнейшем с помощью
CREATE TABLE PARTITION OF будут использовать данное табличное пространство,
если оно не будет переопределено параметром TABLESPACE clause.
Все таблицы текущей базы данных, расположенные в определенном табличном пространстве, могут быть перемещены с использованием
формы ALL IN TABLESPACE , которая сначала блокирует все подлежащие перемещению таблицы, а затем перемещает каждую из них. Данная форма также поддерживает конструкцию
OWNED BY, позволяющую перемещать только те таблицы, владельцами которых являются указанные роли. Если указан параметр NOWAIT , команда завершится ошибкой в случае невозможности немедленного получения всех необходимых блокировок. Обратите внимание, что системные каталоги данной командой не перемещаются; при необходимости используйте ALTER DATABASE или явные вызовы
ALTER TABLE вместо этого. Отношения
information_schema не считаются частью системных каталогов и будут перемещены. См. также
CREATE TABLESPACE.
SET { LOGGED | UNLOGGED } #
Данная форма переводит таблицу из режима без ведения журнала в режим с ведением журнала и наоборот
(см. UNLOGGED). Она не может быть применена к временной таблице.
Это также изменяет режим хранения любых последовательностей, связанных с таблицей (для столбцов типа identity или serial). Тем не менее, режим хранения таких последовательностей можно изменить отдельно.
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 #Эта форма изменяет информацию, записываемую в журнал упреждающей записи (write-ahead log) для идентификации обновляемых или удаляемых строк. В большинстве случаев старое значение каждого столбца фиксируется в журнале только тогда, когда оно отличается от нового значения; однако, если старое значение хранится во внешнем хранилище, оно записывается всегда, независимо от наличия изменений. Данный параметр влияет на работу системы только при использовании логической репликации.
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 NULL, также добавьте
NOT NULL ограничение к столбцу ключа секционирования,
если только он не является выражением.
Если новая секция является внешней таблицей, проверка соответствия всех строк во внешней таблице ограничению секции не выполняется. (См. обсуждение в CREATE FOREIGN TABLE относительно ограничений для внешней таблицы.)
Если таблица имеет секцию по умолчанию, определение новой секции изменяет ограничение секции для секции по умолчанию. Секция по умолчанию не может содержать строк, подлежащих перемещению в новую секцию; она будет просканирована для проверки отсутствия таких строк. Этого сканирования, как и сканирования новой секции, можно избежать при наличии соответствующего CHECK ограничения. Аналогично сканированию новой секции, данная операция всегда пропускается, если секция по умолчанию является внешней таблицей.
Присоединение секции требует блокировки
SHARE UPDATE EXCLUSIVE блокировка родительской таблицы
в дополнение к ACCESS EXCLUSIVE блокировкам присоединяемой таблицы
и секции по умолчанию (при её наличии).
Дополнительные блокировки также должны удерживаться на всех подсекциях, если присоединяемая таблица сама является секционированной. То же самое относится к случаю, когда секция по умолчанию сама является секционированной таблицей. Блокирования подсекций можно избежать, добавив CHECK
ограничение, как описано в
Раздел 2.2.12.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 #Автоматическое удаление объектов, зависящих от удаляемого столбца или ограничения (например, представлений, ссылающихся на столбец), и, в свою очередь, всех объектов, зависящих от них (см. Раздел 2.2.15).
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 и указании
стабильного (non-volatile) DEFAULT выражения, значение по умолчанию вычисляется в момент выполнения инструкции, а результат сохраняется в метаданных таблицы. Это значение будет использоваться для этого столбца во всех существующих
строках. Если DEFAULT не указано, используется значение NULL. Ни в одном из этих случаев перезапись таблицы не требуется.
Добавление столбца с изменчивым (volatile) DEFAULT выражением или изменение типа существующего столбца потребует полной перезаписи таблицы и её индексов. В качестве исключения, при изменении типа существующего столбца, если USING предложение не изменяет содержимое столбца и старый тип либо является бинарно совместимым с новым типом, либо представляет собой домен без ограничений на базе нового типа, перезапись таблицы не требуется. Однако индексы всегда должны перестраиваться, за исключением случаев, когда система может подтвердить, что новый индекс будет логически эквивалентен существующему. Например, если для столбца было изменено правило сортировки (collation), перестройка индекса требуется всегда, так как новый порядок сортировки может отличаться. Тем не менее, при отсутствии изменений в правиле сортировки тип столбца можно изменить с text на varchar (или наоборот) без пересоздания индексов, так как эти типы данных сортируются идентично. Пересоздание таблицы и/или индексов может занять значительное время для таблицы большого размера; кроме того, временно может потребоваться объем дискового пространства, вдвое превышающий исходный.
Добавление CHECK или NOT NULL Ограничение требует сканирования таблицы для проверки соответствия существующих строк ограничению, но не требует перезаписи таблицы.
Аналогично, при присоединении новой секции она может быть просканирована для проверки соответствия существующих строк ограничению секции.
Основная причина предоставления возможности указывать несколько изменений в одной команде ALTER TABLE заключается в том, что несколько операций сканирования или перезаписи таблицы могут быть объединены в один проход по таблице.
Сканирование большой таблицы для проверки нового внешнего ключа или ограничения CHECK может занять длительное время, при этом выполнение других операций обновления таблицы блокируется до тех пор, пока ALTER TABLE ADD CONSTRAINT команда не будет
зафиксирована. Основное назначение NOT VALID
параметра ограничения заключается в снижении влияния операции добавления ограничения на параллельные обновления. При использовании NOT VALID,
the ADD CONSTRAINT команда не выполняет сканирование таблицы
и может быть зафиксирована мгновенно. После этого может быть вызвана команда VALIDATE
CONSTRAINT для подтверждения того, что существующие строки удовлетворяют данному ограничению. Этап валидации не требует блокировки параллельных обновлений, так как предполагается, что другие транзакции будут принудительно применять это ограничение к вставляемым или обновляемым ими строкам; проверке подлежат только
ранее существовавшие строки. Следовательно, проверка запрашивает только SHARE UPDATE EXCLUSIVE блокировка изменяемой
таблицы. (Если ограничение является внешним ключом, то ROW
SHARE блокировка также требуется для таблицы, на которую ссылается ограничение.) Помимо повышения уровня параллелизма, может быть полезно использовать NOT VALID и VALIDATE
CONSTRAINT в случаях, когда известно, что таблица содержит ранее возникшие нарушения. После того как ограничение будет установлено, добавление новых нарушений станет невозможным, а существующие проблемы можно будет устранить в рабочем порядке, пока VALIDATE CONSTRAINT наконец,
не завершится успешно.
Форма DROP COLUMN не удаляет столбец физически, а просто делает его невидимым для SQL-операций. Последующие операции вставки и обновления в таблице будут сохранять значение NULL для этого столбца. Таким образом, удаление столбца происходит быстро, но это не приводит к немедленному уменьшению занимаемого таблицей дискового пространства, так как место, которое занимал удаленный столбец, не освобождается. Это пространство будет высвобождаться постепенно по мере обновления существующих строк.
Чтобы принудительно освободить место, занимаемое удаленным столбцом,
можно выполнить одну из форм ALTER TABLE которая выполняет перезапись всей таблицы. Это приводит к перестройке каждой строки, при которой удаленный столбец заменяется значением NULL.
Формы перезаписи ALTER TABLE не являются MVCC-безопасными. После перезаписи таблицы она будет казаться пустой для параллельных транзакций, если они используют снимок, сделанный до начала перезаписи. См. Раздел 2.10.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 для получения подробного описания допустимых параметров. Глава 2.2 содержит дополнительные сведения о наследовании.
Чтобы добавить столбец типа 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, на отметку времени
с часовым поясом с помощью 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;
Добавление ограничения CHECK для таблицы и всех её дочерних таблиц:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
Добавление ограничения CHECK только для таблицы, без применения к её дочерним таблицам:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;
(Данное ограничение CHECK также не будет наследоваться будущими дочерними таблицами.)
Чтобы удалить ограничение CHECK из таблицы и всех её дочерних таблиц:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
Чтобы удалить ограничение CHECK только из одной таблицы:
ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;
(Ограничение CHECK сохраняется для всех дочерних таблиц.)
Чтобы добавить ограничение внешнего ключа в таблицу:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);
Чтобы добавить ограничение внешнего ключа в таблицу с минимальным воздействием на другие операции:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID; ALTER TABLE distributors VALIDATE CONSTRAINT distfk;
Чтобы добавить (составное) ограничение уникальности в таблицу:
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
Чтобы добавить в таблицу ограничение первичного ключа с автоматически присвоенным именем, учитывая, что у таблицы может быть только один первичный ключ:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
Для перемещения таблицы в другое табличное пространство:
ALTER TABLE distributors SET TABLESPACE fasttablespace;
Для перемещения таблицы в другую схему:
ALTER TABLE myschema.distributors SET SCHEMA yourschema;
Для пересоздания ограничения первичного ключа без блокировки операций обновления во время перестроения индекса:
CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;
Для присоединения секции к таблице, секционированной по диапазону:
ALTER TABLE measurement
ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
Для присоединения секции к таблице, секционированной по списку:
ALTER TABLE cities
ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');
Для присоединения секции к таблице, секционированной по хешу:
ALTER TABLE orders
ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);
Для присоединения секции по умолчанию к секционированной таблице:
ALTER TABLE cities
ATTACH PARTITION cities_partdef DEFAULT;
Для отсоединения секции от секционированной таблицы:
ALTER TABLE measurement
DETACH PARTITION measurement_y2015m12;
Формы ADD (без USING INDEX),
DROP [COLUMN], DROP IDENTITY, RESTART,
SET DEFAULT, SET DATA TYPE (без USING),
SET GENERATED, и SET
соответствуют стандарту SQL. Остальные формы являются
Digital Q.DataBase расширениями стандарта SQL.
Кроме того, возможность указания нескольких манипуляций в одной
sequence_optionALTER TABLE команде является расширением.
ALTER TABLE DROP COLUMN может использоваться для удаления единственного столбца таблицы, в результате чего остается таблица с нулевым количеством столбцов. Это является расширением стандарта SQL, в котором запрещены таблицы без столбцов.