Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

ALTER TABLE

Изменяет определение таблицы.

Синтаксис

ALTER TABLE [IF EXISTS] [ONLY] <name>
    <action> [, ... ]

ALTER TABLE [IF EXISTS] [ONLY] <name>
    RENAME [COLUMN] <column_name> TO <new_column_name>

ALTER TABLE [ IF EXISTS ] [ ONLY ] <name>
    RENAME CONSTRAINT <constraint_name> TO <new_constraint_name>

ALTER TABLE [IF EXISTS] <name>
    RENAME TO <new_name>

ALTER TABLE [IF EXISTS] <name>
    SET SCHEMA <new_schema>

ALTER TABLE ALL IN TABLESPACE <name> [ OWNED BY <role_name> [, ... ] ]
    SET TABLESPACE <new_tablespace> [ NOWAIT ]

ALTER TABLE [IF EXISTS] [ONLY] <name> SET
     WITH (REORGANIZE=true|false [, convert_quicklz_to_zstd])
   | DISTRIBUTED BY ({<column_name> [<opclass>]} [, ... ] )
   | DISTRIBUTED RANDOMLY
   | DISTRIBUTED REPLICATED

ALTER TABLE <name>
   [ ALTER PARTITION { <partition_name> | FOR (RANK(<number>))
   | FOR (<value>) } [...] ] <partition_action>

где action может быть следующим:

  ADD [COLUMN] <column_name data_type> [ DEFAULT <default_expr> ]
      [<column_constraint> [ ... ]]
      [ COLLATE <collation> ]
      [ ENCODING ( <storage_parameter> [,...] ) ]
  DROP [COLUMN] [IF EXISTS] <column_name> [RESTRICT | CASCADE]
  ALTER [COLUMN] <column_name> [ SET DATA ] TYPE <type> [COLLATE <collation>] [USING <expression>]
  ALTER [COLUMN] <column_name> SET DEFAULT <expression>
  ALTER [COLUMN] <column_name> DROP DEFAULT
  ALTER [COLUMN] <column_name> { SET | DROP } NOT NULL
  ALTER [COLUMN] <column_name> SET STATISTICS <integer>
  ALTER [COLUMN] column SET ( <attribute_option> = <value> [, ... ] )
  ALTER [COLUMN] column RESET ( <attribute_option> [, ... ] )
  ADD <table_constraint> [NOT VALID]
  ADD <table_constraint_using_index>
  VALIDATE CONSTRAINT <constraint_name>
  DROP CONSTRAINT [IF EXISTS] <constraint_name> [RESTRICT | CASCADE]
  DISABLE TRIGGER [<trigger_name> | ALL | USER]
  ENABLE TRIGGER [<trigger_name> | ALL | USER]
  CLUSTER ON <index_name>
  SET WITHOUT CLUSTER
  SET WITHOUT OIDS
  SET (<storage_parameter> = <value>)
  RESET (<storage_parameter> [, ... ])
  INHERIT <parent_table>
  NO INHERIT <parent_table>
  OF <type_name>
  NOT OF
  OWNER TO <new_owner>
  SET TABLESPACE <new_tablespace>

где table_constraint_using_index:

  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY } USING INDEX <index_name>
  [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

где partition_action может быть следующим:

  ALTER DEFAULT PARTITION

  DROP DEFAULT PARTITION [IF EXISTS]

  DROP PARTITION [IF EXISTS] { <partition_name> |
      FOR (RANK(<number>)) | FOR (<value>) } [CASCADE]

  TRUNCATE DEFAULT PARTITION

  TRUNCATE PARTITION { <partition_name> | FOR (RANK(<number>)) |
      FOR (<value>) }

  RENAME DEFAULT PARTITION TO <new_partition_name>

  RENAME PARTITION { <partition_name> | FOR (RANK(<number>)) |
      FOR (<value>) } TO <new_partition_name>

  ADD DEFAULT PARTITION <name> [ ( <subpartition_spec> ) ]

  ADD PARTITION [<partition_name>] <partition_element>
     [ ( <subpartition_spec> ) ]

  EXCHANGE PARTITION { <partition_name> | FOR (RANK(<number>)) |
       FOR (<value>) } WITH TABLE <table_name>
        [ WITH | WITHOUT VALIDATION ]

  EXCHANGE DEFAULT PARTITION WITH TABLE <table_name>
   [ WITH | WITHOUT VALIDATION ]

  SET SUBPARTITION TEMPLATE (<subpartition_spec>)

  SPLIT DEFAULT PARTITION
    {  AT (<list_value>)
     | START([<datatype>] <range_value>) [INCLUSIVE | EXCLUSIVE]
        END([<datatype>] <range_value>) [INCLUSIVE | EXCLUSIVE] }
    [ INTO ( PARTITION <new_partition_name>,
             PARTITION <default_partition_name> ) ]

  SPLIT PARTITION { <partition_name> | FOR (RANK(<number>)) |
     FOR (<value>) } AT (<value>)
    [ INTO (PARTITION <partition_name>, PARTITION <partition_name>)]

где partition_element:

    VALUES (<list_value> [,...] )
  | START ([<datatype>] '<start_value>') [INCLUSIVE | EXCLUSIVE]
     [ END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE] ]
  | END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE]
[ WITH ( <partition_storage_parameter>=<value> [, ... ] ) ]
[ TABLESPACE <tablespace> ]

где subpartition_spec:

<subpartition_element> [, ...]

и subpartition_element:

   DEFAULT SUBPARTITION <subpartition_name>
  | [SUBPARTITION <subpartition_name>] VALUES (<list_value> [,...] )
  | [SUBPARTITION <subpartition_name>]
     START ([<datatype>] '<start_value>') [INCLUSIVE | EXCLUSIVE]
     [ END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE] ]
     [ EVERY ( [<number> | <datatype>] '<interval_value>') ]
  | [SUBPARTITION <subpartition_name>]
     END ([<datatype>] '<end_value>') [INCLUSIVE | EXCLUSIVE]
     [ EVERY ( [<number> | <datatype>] '<interval_value>') ]
[ WITH ( <partition_storage_parameter>=<value> [, ... ] ) ]
[ TABLESPACE <tablespace> ]

где storage_parameter:

   appendoptimized={true | false}
   blocksize={8192-2097152}
   orientation={COLUMN|ROW}
   compresstype={ZLIB|ZSTD|RLE_TYPE|NONE}
   compresslevel={1-19}
   fillfactor={10-100}
   analyze_hll_non_part_table={true | false }
   [oids=FALSE]

Описание

ALTER TABLE изменяет определение существующей таблицы. Существует несколько форм:

  • ADD COLUMN — добавляет новый столбец в таблицу, используя тот же синтаксис, что и CREATE TABLE. Выражение ENCODING допустимо только для append-optimized таблиц с колоночной ориентацией.

    Когда вы добавляете столбец в append-optimized таблицу с колоночной ориентацией, Greengage DB устанавливает каждый параметр сжатия данных для столбца (compresstype, compresslevel и blocksize) на основе следующих настроек в порядке приоритета.

    1. Настройка параметра сжатия, указанная в выражении ENCODING команды ALTER TABLE.

    2. Если серверный конфигурационный параметр gp_add_column_inherits_table_setting установлен в on, используются параметры сжатия данных таблицы, указанные в выражении WITH при создании таблицы. По умолчанию этот серверный конфигурационный параметр установлен в off, и параметры выражения WITH игнорируются.

    3. Настройка параметра сжатия, указанная в серверном конфигурационном параметре gp_default_storage_options.

    4. Значение параметра сжатия по умолчанию.

      Для append-optimized и хеш-таблиц ADD COLUMN требует перезаписи таблицы. Информацию о перезаписи таблиц, выполняемой ALTER TABLE, см. в разделе Примечания.

  • DROP COLUMN [IF EXISTS] — удаляет столбец из таблицы. Обратите внимание, что если вы удаляете столбцы таблицы, которые используются в качестве ключа распределения (distribution key) в Greengage DB, политика распределения для таблицы будет изменена на DISTRIBUTED RANDOMLY. Индексы и ограничения таблицы, включающие этот столбец, также автоматически удаляются. Вам нужно указать CASCADE, если что-то вне таблицы зависит от этого столбца (например, представления). Если указано IF EXISTS и столбец не существует, действие выполняется без ошибки; вместо этого будет показано уведомление.

  • IF EXISTS — не завершать действие ошибкой, если таблица не существует. В этом случае будет показано уведомление.

  • SET DATA TYPE — эта форма изменяет тип данных столбца таблицы. Обратите внимание, что нельзя изменить типы данных столбцов, которые используются в качестве ключей распределения или партиционирования. Индексы и простые ограничения таблицы, включающие этот столбец, будут автоматически преобразованы для использования нового типа столбца путем повторного парсинга первоначально предоставленного выражения. Необязательное выражение COLLATE указывает правило сортировки (collation) для нового столбца; если оно опущено, правило сортировки будет по умолчанию для нового типа столбца. Необязательное выражение USING указывает, как вычислить значение нового столбца из старого. Если оно опущено, преобразование по умолчанию совпадает с приведением присваивания от старого типа данных к новому. Выражение USING должно быть указано, если нет неявного приведения или приведения присваивания от старого типа к новому.

    ПРИМЕЧАНИЕ

    GPORCA поддерживает правило сортировки только тогда, когда все столбцы в запросе используют одно и то же правило сортировки. Если столбцы в запросе используют разные правила сортировки, Greengage DB использует планировщик Postgres.

    Изменение типа данных столбца требует перезаписи таблицы. Информацию о перезаписи таблиц, выполняемой ALTER TABLE, см. в разделе Примечания.

  • SET/DROP DEFAULT — устанавливает или удаляет значение по умолчанию для столбца. Значения по умолчанию применяются только в последующих командах INSERT или UPDATE; они не приводят к изменению строк, уже находящихся в таблице.

  • SET/DROP NOT NULL — изменяет, помечен ли столбец как допускающий null-значения или отвергающий их. Вы можете использовать SET NOT NULL только тогда, когда столбец не содержит null-значений.

  • SET STATISTICS — устанавливает целевое значение сбора статистики по столбцу для последующих операций ANALYZE. Целевое значение может быть установлено в диапазоне от 0 до 10000 или установлено в -1 для возврата к использованию системного целевого значения статистики по умолчанию (default_statistics_target). При значении 0 статистика не собирается.

  • SET ( <attribute_option> = <value> [, …​ ]), RESET ( <attribute_option> [, …​] ) — устанавливает или сбрасывает параметры атрибутов. В настоящее время единственными параметрами атрибутов являются n_distinct и n_distinct_inherited, которые переопределяют оценки количества различных значений, сделанные последующими операциями ANALYZE. n_distinct влияет на статистику для самой таблицы, в то время как n_distinct_inherited влияет на статистику, собранную для таблицы плюс ее дочерних таблиц наследования. При установке в положительное значение ANALYZE будет предполагать, что столбец содержит ровно указанное количество различных не-null значений. При установке в отрицательное значение, которое должно быть больше или равно -1, ANALYZE будет предполагать, что количество различных не-null значений в столбце линейно зависит от размера таблицы; точное количество вычисляется путем умножения оценочного размера таблицы на абсолютное значение заданного числа. Например, значение -1 подразумевает, что все значения в столбце различны, а значение -0.5 подразумевает, что каждое значение появляется в среднем дважды. Это может быть полезно, когда размер таблицы изменяется с течением времени, поскольку умножение на количество строк в таблице не выполняется до момента планирования запроса. Укажите значение 0, чтобы вернуться к обычной оценке количества различных значений.

  • ADD <table_constraint> [NOT VALID] — добавляет новое ограничение к таблице (не только к партиции), используя тот же синтаксис, что и CREATE TABLE. Опция NOT VALID в настоящее время разрешена только для ограничений внешнего ключа и CHECK. Если ограничение помечено как NOT VALID, Greengage DB пропускает потенциально длительную начальную проверку того, что все строки в таблице удовлетворяют ограничению. Ограничение все равно будет применяться к последующим вставкам или обновлениям (то есть они не будут выполнены, если нет соответствующей строки в ссылочной таблице в случае внешних ключей; и они не будут выполнены, если новая строка не соответствует указанным ограничениям проверки). Но база данных не будет предполагать, что ограничение выполняется для всех строк в таблице, пока оно не будет проверено с помощью опции VALIDATE CONSTRAINT. Проверки ограничений пропускаются во время создания таблицы, поэтому синтаксис CREATE TABLE не включает эту опцию.

  • VALIDATE CONSTRAINT — эта форма проверяет ограничение внешнего ключа, которое ранее было создано как NOT VALID, сканируя таблицу, чтобы убедиться, что нет строк, для которых ограничение не выполняется. Если ограничение уже помечено как действительное, то ничего не происходит. Преимущество отделения проверки от начального создания ограничения заключается в том, что проверка требует меньшей блокировки таблицы, чем создание ограничения.

  • ADD <table_constraint_using_index> — добавляет новое ограничение PRIMARY KEY или UNIQUE к таблице на основе существующего уникального индекса. Все столбцы индекса будут включены в ограничение. Индекс не может иметь столбцов-выражений или быть частичным индексом. Кроме того, это должен быть B-tree индекс с порядком сортировки по умолчанию. Эти ограничения гарантируют, что индекс эквивалентен тому, который был бы построен обычной командой ADD PRIMARY KEY или ADD UNIQUE.

    Добавление ограничения PRIMARY KEY или UNIQUE к таблице на основе существующего уникального индекса не поддерживается для партиционированной таблицы.

    Если указано PRIMARY KEY и столбцы индекса еще не помечены как NOT NULL, то эта команда попытается выполнить ALTER COLUMN SET NOT NULL для каждого такого столбца. Это требует полного сканирования таблицы, чтобы убедиться, что столбцы не содержат null. Во всех остальных случаях это быстрая операция.

    Если указано имя ограничения, то индекс будет переименован в соответствии с именем ограничения. В противном случае ограничение будет названо так же, как индекс.

    После выполнения этой команды индекс "принадлежит" ограничению так же, как если бы индекс был построен обычной командой ADD PRIMARY KEY или ADD UNIQUE. В частности, удаление ограничения приведет к исчезновению индекса.

  • DROP CONSTRAINT [IF EXISTS] — удаляет указанное ограничение таблицы. Если указано IF EXISTS и ограничение не существует, действие выполняется без ошибки. В этом случае будет показано уведомление.

  • DISABLE/ENABLE TRIGGER — деактивирует или активирует триггеры, принадлежащие таблице. Деактивированный триггер все еще известен системе, но не выполняется при возникновении инициирующего события. Для отложенного триггера статус включения проверяется при возникновении события, а не при фактическом выполнении функции триггера. Можно деактивировать или активировать один триггер, указанный по имени, или все триггеры таблицы, или только созданные пользователем триггеры. Деактивация или активация триггеров ограничений требует прав суперпользователя.

    ПРИМЕЧАНИЕ

    Триггеры имеют очень ограниченную функциональность из-за параллелизма Greengage DB.

  • CLUSTER ON/SET WITHOUT CLUSTER — выбирает или удаляет индекс по умолчанию для будущих операций CLUSTER. Перекластеризация таблицы при этом не выполняется. Обратите внимание, что CLUSTER не является рекомендуемым способом физического переупорядочивания таблицы в Greengage DB, так как это занимает много времени. Лучше пересоздать таблицу с помощью CREATE TABLE AS и упорядочить ее по столбцам индекса.

    ПРИМЕЧАНИЕ

    CLUSTER ON не поддерживается для append-optimized таблиц.

  • SET WITHOUT OIDS — удаляет системный столбец OID из таблицы.

    Нельзя создать OID для партиционированной или колоночной таблицы (будет выведена ошибка).

    ВНИМАНИЕ

    Использование SET WITH OIDS не рекомендуется для пользовательских таблиц, так как использование OID для больших таблиц может привести к переполнению 32-битного счетчика OID. После переполнения счетчика OID больше нельзя считать уникальными, что не только делает их бесполезными для пользовательских приложений, но и может вызвать проблемы в системных таблицах каталога Greengage DB. Кроме того, исключение OID из таблицы уменьшает пространство, необходимое для хранения таблицы на диске, на 4 байта на строку, что немного улучшает производительность.

  • SET ( FILLFACTOR = <value>) / RESET (FILLFACTOR) — изменяет фактор заполнения (fillfactor) для таблицы. Фактор заполнения для таблицы — это процент от 10 до 100. 100 (полная упаковка) — значение по умолчанию. Когда указан меньший фактор заполнения, операции INSERT заполняют страницы таблицы только до указанного процента; оставшееся место на каждой странице резервируется для обновления строк на этой странице. Это дает операции UPDATE шанс разместить обновленную копию строки на той же странице, что и оригинал, что более эффективно, чем размещение на другой странице. Для таблицы, записи которой никогда не обновляются, полная упаковка — лучший выбор, но в часто обновляемых таблицах уместны меньшие значения фактора заполнения. Обратите внимание, что содержимое таблицы не будет немедленно изменено этой командой. Вам нужно будет перезаписать таблицу, чтобы получить желаемый эффект. Это можно сделать с помощью VACUUM или одной из форм ALTER TABLE, которая принудительно перезаписывает таблицу. Информацию о формах ALTER TABLE, которые выполняют перезапись таблицы, см. в разделе Примечания.

  • SET DISTRIBUTED — изменяет политику распределения таблицы. Изменение политики хеш-распределения или переход к реплицированному распределению и от него приведет к физическому перераспределению данных таблицы на диске, что может быть ресурсоемким. Greengage DB не разрешает изменять политику распределения пишущей внешней таблицы.

  • INHERIT <parent_table> / NO INHERIT <parent_table> — добавляет или удаляет целевую таблицу как дочернюю для указанной родительской таблицы. Запросы к родительской таблице будут включать записи ее дочерней таблицы. Чтобы быть добавленной в качестве дочерней, целевая таблица уже должна содержать все те же столбцы, что и родительская (она также может иметь дополнительные столбцы). Столбцы должны иметь совпадающие типы данных, и если они имеют ограничения NOT NULL в родительской таблице, то они также должны иметь ограничения NOT NULL в дочерней. Также должны быть совпадающие ограничения дочерней таблицы для всех ограничений CHECK родительской таблицы, за исключением тех, которые помечены как не наследуемые (то есть созданы с помощью ALTER TABLE …​ ADD CONSTRAINT …​ NO INHERIT) в родительской таблице, которые игнорируются; все совпадающие ограничения дочерней таблицы не должны быть помечены как не наследуемые. В настоящее время ограничения UNIQUE, PRIMARY KEY и FOREIGN KEY не учитываются, но это может измениться в будущем.

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

  • NOT OF — эта форма разрывает связь типизированной таблицы с ее типом.

  • OWNER — изменяет владельца таблицы, последовательности или представления на указанного пользователя.

  • SET TABLESPACE — изменяет табличное пространство таблицы на указанное табличное пространство и перемещает файлы данных, связанные с таблицей, в новое табличное пространство. Индексы таблицы, если они есть, не перемещаются; но их можно переместить отдельно с помощью дополнительных команд SET TABLESPACE. Все таблицы в текущей базе данных в табличном пространстве можно переместить, используя форму ALL IN TABLESPACE, которая сначала заблокирует все таблицы для перемещения, а затем переместит каждую из них. Эта форма также поддерживает OWNED BY, которая переместит только таблицы, принадлежащие указанным ролям. Если указана опция NOWAIT, команда завершится ошибкой, если не сможет немедленно получить все необходимые блокировки. Обратите внимание, что системные каталоги не перемещаются этой командой; используйте ALTER DATABASE или явные вызовы ALTER TABLE, если это необходимо. Отношения information_schema не считаются частью системных каталогов и будут перемещены. См. также CREATE TABLESPACE. При изменении табличного пространства партиционированной таблицы все дочерние партиции таблицы также будут перемещены в новое табличное пространство.

  • RENAME — изменяет имя таблицы (или индекса, последовательности, представления или материализованного представления), имя отдельного столбца в таблице или имя ограничения таблицы. Не влияет на хранимые данные. Обратите внимание, что столбцы ключа распределения Greengage DB нельзя переименовывать.

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

  • ALTER PARTITION | DROP PARTITION | RENAME PARTITION | TRUNCATE PARTITION | ADD PARTITION | SPLIT PARTITION | EXCHANGE PARTITION | SET SUBPARTITION TEMPLATE — изменяет структуру партиционированной таблицы. В большинстве случаев требуется действовать через родительскую таблицу, чтобы изменить одну из ее дочерних партиций.

ПРИМЕЧАНИЕ

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

Все формы ALTER TABLE, которые действуют на одну таблицу, за исключением RENAME и SET SCHEMA, могут быть объединены в список из нескольких изменений для совместного применения. Например, можно добавить несколько столбцов и/или изменить тип нескольких столбцов одной командой. Это особенно полезно для больших таблиц, так как потребуется только один проход по таблице.

Необходимо быть владельцем таблицы, чтобы использовать ALTER TABLE. Чтобы изменить схему или табличное пространство таблицы, необходимо также иметь привилегию CREATE в новой схеме или табличном пространстве. Чтобы добавить таблицу в качестве новой дочерней таблицы родительской таблицы, вы также должны быть владельцем родительской таблицы. Чтобы изменить владельца, необходимо также быть прямым или косвенным членом новой роли-владельца, и эта роль должна иметь привилегию CREATE в схеме таблицы. Чтобы добавить столбец или изменить тип столбца или использовать выражение OF, необходимо также иметь привилегию USAGE для типа данных. Суперпользователь имеет эти привилегии автоматически.

ПРИМЕЧАНИЕ

Использование памяти значительно возрастает, когда таблица имеет много партиций, если таблица имеет сжатие или если размер блока для таблицы велик. Если количество отношений, связанных с таблицей, велико, это условие может заставить операцию над таблицей использовать больше памяти. Например, если таблица имеет колоночную ориентацию (column-oriented) и большое количество столбцов, каждый столбец является отношением. Операция типа ALTER TABLE ALTER COLUMN открывает все столбцы в таблице и выделяет связанные буферы. Если таблица с колоночной ориентацией имеет 40 столбцов и 100 партиций, а столбцы сжаты и размер блока составляет 2 МБ (с системным фактором 3), система попытается выделить 24 ГБ, то есть (40 × 100) × (2 × 3) МБ или 24 ГБ.

Параметры

Параметр Описание

ONLY

Выполнять операцию только над указанным именем таблицы. Если ключевое слово ONLY не используется, операция будет выполнена над указанной таблицей и любыми дочерними партициями таблицы, связанными с этой таблицей.

ПРИМЕЧАНИЕ

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

name

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

ПРИМЕЧАНИЕ

Ограничения могут быть добавлены только ко всей таблице, а не к партиции. Из-за этого ограничения параметр name может содержать только имя таблицы, а не имя партиции.

column_name

Имя нового или существующего столбца. Обратите внимание, что со столбцами ключа распределения Greengage DB следует обращаться с особой осторожностью. Изменение или удаление этих столбцов может изменить политику распределения для таблицы

new_column_name

Новое имя для существующего столбца

new_name

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

type

Тип данных нового столбца или новый тип данных для существующего столбца. При изменении типа данных столбца ключа распределения разрешается изменять его только на совместимый тип (например, text на varchar допустимо, но text на int — нет)

table_constraint

Новое ограничение таблицы. Обратите внимание, что ограничения внешнего ключа в настоящее время не поддерживаются в Greengage DB. Также таблице разрешено иметь только одно уникальное ограничение, и уникальность должна быть в рамках ключа распределения Greengage DB

constraint_name

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

CASCADE

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

RESTRICT

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

trigger_name

Имя одного триггера для деактивации или включения. Обратите внимание, что Greengage DB не поддерживает триггеры

ALL

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

USER

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

index_name

Имя индекса, по которому таблица должна быть помечена для кластеризации. Обратите внимание, что CLUSTER не является рекомендуемым способом физического переупорядочивания таблицы в Greengage DB, так как это занимает много времени. Лучше пересоздать таблицу с помощью CREATE TABLE AS и упорядочить ее по столбцам индекса

FILLFACTOR

Установить процент фактора заполнения (fillfactor) для таблицы.

Опция допустима только для heap-таблиц (appendoptimized=false)

value

Новое значение параметра FILLFACTOR, которое является процентом от 10 до 100. Значение по умолчанию — 100

DISTRIBUTED BY ({<column_name> [<opclass>]}) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED

Указывает политику распределения для таблицы. Изменение политики хеш-распределения приводит к физическому перераспределению данных таблицы, что может быть ресурсоемким. Если вы объявляете ту же политику хеш-распределения или меняете хеш-распределение на случайное, данные не будут перераспределены, если вы не укажете SET WITH (REORGANIZE=true).

Переход к реплицированному распределению и от него приводит к перераспределению данных таблицы

analyze_hll_non_part_table= true|false

Используйте analyze_hll_non_part_table=true для принудительного сбора статистики HLL, даже если таблица не является частью партиционированной таблицы. Значение по умолчанию — false

reorganize=true|false

Используйте REORGANIZE=true, когда политика хеш-распределения не изменилась или когда вы изменили хеш-распределение на случайное, и вы хотите перераспределить данные в любом случае

parent_table

Родительская таблица для связывания или разрыва связи с этой таблицей

new_owner

Имя роли нового владельца таблицы

new_tablespace

Имя табличного пространства, в которое будет перемещена таблица

new_schema

Имя схемы, в которую будет перемещена таблица

parent_table_name

При изменении партиционированной таблицы — имя родительской таблицы верхнего уровня

ALTER [DEFAULT] PARTITION

Если изменяется партиция глубже первого уровня партиций, используйте выражения ALTER PARTITION, чтобы указать, какую подпартицию в иерархии вы хотите изменить. Для каждого уровня партиционирования в иерархии таблицы, находящегося выше целевой партиции, укажите партицию, которая связана с целевой партицией, в выражении ALTER PARTITION

DROP [DEFAULT] PARTITION

Удаляет указанную партицию. Если партиция имеет подпартиции, подпартиции также автоматически удаляются

TRUNCATE [DEFAULT] PARTITION

Удаляет все строки из указанной партиции. Если партиция имеет подпартиции, они также автоматически очищаются

RENAME [DEFAULT] PARTITION

Изменяет имя партиции (не имя отношения). Партиционированные таблицы создаются с использованием соглашения об именовании: <parentname>_<level>_prt_<partition_name>

ADD DEFAULT PARTITION

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

ADD PARTITION

  • partition_element — используя существующий тип партиционирования таблицы (по диапазону или списку), определяет границы новой добавляемой партиции.

  • name — имя для этой новой партиции.

  • VALUES — для партиций по списку определяет значения, которые будет содержать партиция.

  • START — для партиций по диапазону определяет начальное значение диапазона для партиции. По умолчанию начальные значения включены в диапазон (INCLUSIVE). Например, если вы объявили начальную дату 2016-01-01, то партиция будет содержать все даты, больше или равные 2016-01-01. Обычно тип данных выражения START совпадает с типом столбца ключа партиционирования. Если это не так, требуется явно привести его к нужному типу данных.

  • END — для партиций по диапазону определяет конечное значение диапазона. По умолчанию конечные значения не включены в диапазон (EXCLUSIVE). Например, если вы объявили конечную дату 2016-02-01, то партиция будет содержать все даты, меньшие, но не равные 2016-02-01. Обычно тип данных выражения END совпадает с типом столбца ключа партиционирования. Если это не так, требуется явно привести его к нужному типу данных.

  • WITH — устанавливает параметры хранения таблицы для партиции. Например, вы можете захотеть, чтобы старые партиции были append-optimized таблицами, а новые — обычными heap-таблицами. См. CREATE TABLE для описания параметров хранения.

  • TABLESPACE — имя табличного пространства, в котором должна быть создана партиция.

  • subpartition_spec — разрешено только для схем партиционирования, созданных без шаблона подпартиций. Объявляет спецификацию подпартиции для новой добавляемой партиции. Если партиционированная таблица была изначально определена с использованием шаблона подпартиций, то шаблон будет использован для автоматической генерации подпартиций.

EXCHANGE [DEFAULT] PARTITION

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

Серверный конфигурационный параметр Greengage DB gp_enable_exchange_default_partition управляет доступностью выражения EXCHANGE DEFAULT PARTITION. Значение по умолчанию для этого параметра — off. Выражение недоступно и Greengage DB возвращает ошибку, если выражение указано в команде ALTER TABLE.

ВНИМАНИЕ

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

  • WITH TABLE table_name — имя таблицы, которую вы меняете местами в схеме партиционирования. Вы можете обменять таблицу, данные которой хранятся в базе данных. Например, таблицу, созданную командой CREATE TABLE. Таблица должна иметь то же количество столбцов, порядок столбцов, имена столбцов, типы столбцов и политику распределения, что и родительская таблица.

    С помощью выражения EXCHANGE PARTITION вы также можете обменять читающую внешнюю таблицу (созданную командой CREATE EXTERNAL TABLE) в иерархию партиционирования вместо существующей дочерней листовой партиции. Если вы указываете читающую внешнюю таблицу, вы также должны указать выражение WITHOUT VALIDATION, чтобы пропустить проверку таблицы на соответствие ограничению CHECK заменяемой партиции.

    Обмен дочерней листовой партиции на внешнюю таблицу не поддерживается, если партиционированная таблица содержит столбец с ограничением проверки или ограничением NOT NULL.

    Нельзя обменять партицию на реплицированную таблицу. Обмен партиции на партиционированную таблицу или дочернюю партицию партиционированной таблицы не поддерживается.

  • WITH | WITHOUT VALIDATION — проверяет, соответствуют ли данные в таблице ограничению CHECK заменяемой партиции. По умолчанию выполняется проверка данных на соответствие ограничению CHECK.

    ВНИМАНИЕ

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

SET SUBPARTITION TEMPLATE

Изменяет шаблон подпартиций для существующей партиции. После установки нового шаблона подпартиций все новые добавляемые партиции будут иметь новую схему подпартиций (существующие партиции не изменяются)

SPLIT DEFAULT PARTITION

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

  • AT — для таблиц, партиционированных по списку, указывает одно значение списка, которое должно использоваться в качестве критерия для разделения.

  • START — для таблиц, партиционированных по диапазону, указывает начальное значение для новой партиции.

  • END — для таблиц, партиционированных по диапазону, указывает конечное значение для новой партиции.

  • INTO — позволяет указать имя для новой партиции. При использовании выражения INTO для разделения партиции по умолчанию второе указанное имя партиции всегда должно совпадать с именем существующей партиции по умолчанию. Если вы не знаете имя партиции по умолчанию, вы можете найти его с помощью представления pg_partitions.

SPLIT PARTITION

Разделяет существующую партицию на две партиции. В многоуровневом партиционировании можно разделить только партицию по диапазону, а не по списку, и можно разделить только партиции самого нижнего уровня (те, которые содержат данные).

  • AT — указывает одно значение, которое должно использоваться в качестве критерия для разделения. Партиция будет разделена на две новые партиции, при этом указанное значение разделения будет начальным диапазоном для последней партиции.

  • INTO — позволяет указать имена для двух новых партиций, созданных разделением

partition_name

Заданное имя партиции. Это значение столбца partitionname в системном представлении pg_partitions

FOR (RANK(<number>))

Для партиций по диапазону — ранг партиции в диапазоне

FOR ('<value>')

Указывает партицию путем объявления значения, которое попадает в спецификацию границ партиции. Если значение, объявленное с помощью FOR, соответствует как партиции, так и одной из ее подпартиций (например, если значение является датой, а таблица партиционирована по месяцам, а затем по дням), то FOR будет действовать на первом уровне, где найдено совпадение (например, месячная партиция). Если требуется выполнить действие над подпартицией, необходимо объявить его следующим образом: ALTER TABLE name ALTER PARTITION FOR ('2016-10-01') DROP PARTITION FOR ('2016-10-01');

Примечания

Имя таблицы, указанное в команде ALTER TABLE, не может быть именем партиции внутри таблицы.

Будьте особенно осторожны при изменении или удалении столбцов, которые являются частью ключа распределения Greengage DB, так как это может изменить политику распределения для таблицы.

Greengage DB в настоящее время не поддерживает ограничения внешнего ключа. Чтобы уникальное ограничение применялось в Greengage DB, таблица должна быть распределена по хешу (не DISTRIBUTED RANDOMLY) и все столбцы ключа распределения должны совпадать с начальными столбцами уникального ограничения.

Добавление ограничения CHECK или NOT NULL требует сканирования таблицы для проверки того, что существующие строки соответствуют ограничению, но не требует перезаписи таблицы.

В таблице ниже перечислены операции ALTER TABLE, требующие перезаписи таблицы при выполнении над таблицами, определенными с указанным типом хранения.

Операция (см. примечание) Append-optimized, колоночная ориентация Append-optimized, строковая ориентация Heap

ALTER COLUMN TYPE

Да

Да

Да

ADD COLUMN

Нет

Да

Да

ПРИМЕЧАНИЕ

Удаление системного столбца oid также требует перезаписи таблицы.

Когда столбец добавляется с помощью ADD COLUMN, все существующие строки в таблице инициализируются значением по умолчанию для столбца или NULL, если выражение DEFAULT не указано. Добавление столбца с не-null значением по умолчанию или изменение типа существующего столбца потребует перезаписи всей таблицы и индексов. В качестве исключения, если выражение USING не меняет содержимое столбца и старый тип либо бинарно приводим к новому типу, либо является неограниченным доменом над новым типом, перезапись таблицы не требуется, но любые индексы для затронутых столбцов все равно должны быть перестроены. Перестроение таблицы и/или индекса может занять значительное время для большой таблицы и временно потребовать вдвое больше дискового пространства.

ВАЖНО

Формы ALTER TABLE, выполняющие перезапись таблицы для append-optimized таблицы, не являются MVCC-безопасными. После перезаписи таблицы таблица будет казаться пустой для параллельных транзакций, если они используют снимок, сделанный до перезаписи. См. MVCC Caveats для получения подробной информации.

Вы можете указать несколько изменений в одной команде ALTER TABLE, которые будут выполнены за один проход по таблице.

Форма DROP COLUMN физически не удаляет столбец, а просто делает его невидимым для SQL-операций. Последующие операции вставки и обновления в таблице будут сохранять null-значение для столбца. Таким образом, удаление столбца происходит быстро, но это не приведет к немедленному уменьшению размера таблицы на диске, так как пространство, занимаемое удаленным столбцом, не освобождается. Пространство будет освобождаться со временем по мере обновления существующих строк. Однако, если вы удалите системный столбец oid, таблица будет перезаписана немедленно.

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

Опция USING для SET DATA TYPE может фактически указывать любое выражение, включающее старые значения строки; то есть она может ссылаться на другие столбцы, а также на преобразуемый. Это позволяет выполнять очень общие преобразования с помощью синтаксиса SET DATA TYPE. Из-за этой гибкости выражение USING не применяется к значению по умолчанию столбца (если оно есть); результат может не быть константным выражением, как требуется для значения по умолчанию. Это означает, что когда нет неявного приведения или приведения присваивания от старого типа к новому, SET DATA TYPE может не преобразовать значение по умолчанию, даже если предоставлено выражение USING. В таких случаях удалите значение по умолчанию с помощью DROP DEFAULT, выполните ALTER TYPE, а затем используйте SET DEFAULT, чтобы добавить подходящее новое значение по умолчанию. Похожие соображения применимы к индексам и ограничениям, включающим столбец.

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

Чтобы увидеть структуру партиционированной таблицы, вы можете использовать системное представление pg_partitions. Это представление может помочь определить конкретные партиции, которые вы, возможно, захотите изменить.

Рекурсивная операция DROP COLUMN удалит столбец таблицы-потомка только в том случае, если потомок не наследует этот столбец от других родителей и никогда не имел независимого определения столбца. Нерекурсивная DROP COLUMN (ALTER TABLE ONLY …​ DROP COLUMN) никогда не удаляет столбцы потомков, а вместо этого помечает их как независимо определенные, а не унаследованные.

Действия TRIGGER, CLUSTER, OWNER и TABLESPACE никогда не распространяются на таблицы-потомки рекурсивно; то есть они всегда действуют так, как если бы было указано ONLY. Добавление ограничения распространяется рекурсивно только для ограничений CHECK, которые не помечены как NO INHERIT.

Следующие операции ALTER PARTITION поддерживаются, если данные не изменяются в партиционированной таблице, содержащей дочернюю листовую партицию, которая была заменена на использование внешней таблицы. В противном случае возвращается ошибка.

  • Добавление или удаление столбца.

  • Изменение типа данных столбца.

Следующие операции ALTER PARTITION не поддерживаются для партиционированной таблицы, которая содержит дочернюю листовую партицию, замененную на использование внешней таблицы:

  • Установка шаблона подпартиций.

  • Изменение свойств партиции.

  • Создание партиции по умолчанию.

  • Установка политики распределения.

  • Установка или удаление ограничения NOT NULL столбца.

  • Добавление или удаление ограничений.

  • Разделение внешней партиции.

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

Примеры

Добавить столбец в таблицу:

ALTER TABLE distributors
    ADD COLUMN address varchar(30);

Переименовать существующий столбец:

ALTER TABLE distributors
    RENAME COLUMN address TO city;

Переименовать существующую таблицу:

ALTER TABLE distributors
    RENAME TO suppliers;

Добавить ограничение not-null к столбцу:

ALTER TABLE distributors
    ALTER COLUMN street SET NOT NULL;

Переименовать существующее ограничение:

ALTER TABLE distributors
    RENAME CONSTRAINT zipchk TO zip_check;

Добавить ограничение-проверку к таблице и всем ее потомкам:

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;

Ограничение-проверка остается в силе для любых дочерних таблиц, наследующих distributors.

Переместить таблицу в другую схему:

ALTER TABLE myschema.distributors
    SET SCHEMA yourschema;

Изменить политику распределения таблицы на реплицируемую:

ALTER TABLE myschema.distributors
    SET DISTRIBUTED REPLICATED;

Добавить новую партицию в партиционированную таблицу:

ALTER TABLE sales
    ADD PARTITION
        START (date '2017-02-01') INCLUSIVE
        END (date '2017-03-01') EXCLUSIVE;

Добавить партицию по умолчанию к существующей схеме партиционирования:

ALTER TABLE sales
    ADD DEFAULT PARTITION other;

Переименовать партицию:

ALTER TABLE sales
    RENAME PARTITION FOR ('2016-01-01') TO jan08;

Удалить первую (самую раннюю) партицию в последовательности диапазонов:

ALTER TABLE sales
    DROP PARTITION FOR (RANK(1));

Вставить существующую таблицу в структуру партиционирования:

ALTER TABLE sales
    EXCHANGE PARTITION FOR ('2016-01-01') WITH TABLE jan08;

Разделить партицию по умолчанию (где имя существующей партиции по умолчанию other), чтобы добавить новую месячную партицию для января 2026 года:

ALTER TABLE sales
    SPLIT DEFAULT PARTITION
        START ('2026-01-01') INCLUSIVE
        END ('2026-02-01') EXCLUSIVE
        INTO (PARTITION jan26, PARTITION other);

Разделить месячную партицию на две, где первая партиция содержит даты с 1 по 15 января, а вторая — с 16 по 31 января:

ALTER TABLE sales
    SPLIT PARTITION FOR ('2016-01-01')
        AT ('2016-01-16')
        INTO (PARTITION jan081to15, PARTITION jan0816to31);

Для многоуровневой партиционированной таблицы, состоящей из трех уровней (год, квартал и регион), обменять листовую партицию region на таблицу region_new.

ALTER TABLE sales
    ALTER PARTITION year_1 ALTER PARTITION quarter_4 EXCHANGE PARTITION region WITH TABLE region_new;

В предыдущей команде два выражения ALTER PARTITION идентифицируют, какую партицию region нужно обменять. Оба выражения необходимы для идентификации конкретной партиции для обмена.

Совместимость

Формы ADD (без USING INDEX), DROP, SET DEFAULT и SET DATA TYPE (без USING) соответствуют стандарту SQL. Остальные формы являются расширениями стандарта SQL в Greengage DB. Кроме того, возможность указывать более одной манипуляции в одной команде ALTER TABLE является расширением.

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

См. также