ALTER TABLE

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

Обзор

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

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

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

ALTER TABLE [IF EXISTS] name 
    RENAME TO new_name

ALTER TABLE [IF EXISTS] name 
    SET SCHEMA new_schema

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

ALTER TABLE [IF EXISTS] name 
    SET (encodechain=new_encodechain)

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

ALTER TABLE [IF EXISTS] [ONLY] name SET SEGMENT_SET segment_set_name

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

При этом action — одно из следующих:

  ADD [COLUMN] column_name data_type [ DEFAULT default_expr ]
      [column_constraint [ ... ]]
      [ COLLATE collation ]
      [ ENCODING ( storage_directive [,...] ) ]
  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] 
        [[SEGMENT_SET segment_set_name]] }
    [ 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|QUICKLZ|RLE_TYPE|NONE|MXCUSTOM}
   // When compresstype=MXCUSTOM, you need to specify the specific encodechain.
   encodechain={LZ4|ZSTD|DELTADELTA|DELTAZIGZAG|GORILLA|FLOATINT|SIMPLE8B|AUTO}
   /* When compresstype=MXCUSTOM and encodechain=AUTO, adaptive encoding mode can be specified at the table level:     
    * automode=1 indicates compression ratio priority, automode=2 indicates speed priority 
    */
   automode={1|2}
   compresslevel={0-9}
   fillfactor={10-100}
   oids[FALSE]

Описание

ALTER TABLE изменяет определение таблицы. Ниже описаны несколько форм:

  • ADD COLUMN — Добавляет новый столбец в таблицу, используя ту же семантику, что и CREATE TABLE. Предложение ENCODING допустимо только при добавлении к таблице с хранением по столбцам.
  • DROP COLUMN [IF EXISTS] — Удаляет столбец из таблицы. Обратите внимание, что если вы удаляете столбец, используемый как ключ секционирования базы данных YMatrix, стратегия секционирования таблицы изменится на DISTRIBUTED RANDOMLY. Индексы и ограничения таблицы, связанные с этим столбцом, также будут автоматически удалены. Если на этот столбец есть внешние зависимости (например, представление), необходимо указать CASCADE. Если указано IF EXISTS, и столбец не существует, ошибка не возникает, но выводится уведомление.
  • IF EXISTS — Если таблица не существует, не вызывать ошибку, а выдать уведомление.
  • SET DATA TYPE — Изменяет тип данных столбцов таблицы. Обратите внимание, что нельзя изменить тип данных столбцов, используемых как ключи распределения или ключи секционирования. Индексы и простые ограничения таблицы, связанные со столбцом, автоматически преобразуются для использования нового типа столбца путём повторного разбора первоначально заданного выражения. Необязательное предложение COLLATE указывает правило сортировки для нового столбца; если опущено, используется правило сортировки по умолчанию для нового типа столбца. Необязательное предложение USING определяет способ вычисления нового значения столбца из старого. Если опущено, используется преобразование по умолчанию, аналогичное преобразованию из старого типа данных в новый. Если нет неявного или явного преобразования из старого типа в новый, предложение USING должно быть указано.
  • 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 и encodechain.. Первые две переопределяют оценку количества уникальных значений, выполняемую последующими операциями ANALYZE, в то время как encodechain используется для изменения алгоритма сжатия цепочки кодирования после создания таблицы. n_distinct влияет на статистику самой таблицы, а n_distinct_inherited — на статистику, собираемую таблицей и её наследуемыми дочерними узлами. При положительном значении ANALYZE предполагает, что столбец содержит ровно указанное количество различных ненулевых значений. При отрицательном значении (должно быть больше или равно -1) ANALYZE предполагает, что количество различных ненулевых значений в столбце линейно зависит от размера таблицы; точное количество рассчитывается путём умножения оценённого размера таблицы на абсолютное значение указанного числа. Например, значение -1 означает, что все значения в столбце различны, а значение -0.5 — что каждое значение встречается в среднем дважды. Это полезно, когда размер таблицы меняется со временем, поскольку умножение на количество строк в таблице выполняется только во время планирования запроса. Установка значения в 0 восстанавливает оценку по умолчанию количества различных значений.
  • ADD table_constraint [NOT VALID] — Добавляет новое ограничение к таблице (не к партициям) с использованием той же синтаксиса, что и CREATE TABLE. Опция NOT VALID в настоящее время используется только для внешних ключей и проверочных ограничений. Если ограничение помечено как NOT VALID, база данных YMatrix пропускает потенциально длительную начальную проверку соответствия всех строк таблицы ограничению. Ограничения всё равно будут применяться к последующим вставкам или обновлениям (то есть для внешних ключей операции завершатся ошибкой, если нет соответствующей строки в ссылочной таблице; для проверочных ограничений операции завершатся ошибкой, если новая строка не удовлетворяет указанному условию). Однако база данных не будет считать ограничение действительным для всех строк таблицы, пока оно не будет подтверждено с помощью опции VALIDATE CONSTRAINT. Проверки ограничений пропускаются при создании таблицы, поэтому синтаксис CREATE TABLE не включает эту опцию.
  • VALIDATE CONSTRAINT — Эта форма проверяет ранее созданное ограничение NOT VALID (внешний ключ), сканируя таблицу, чтобы убедиться, что нет строк, нарушающих ограничение. Если ограничение уже помечено как действительное, ничего не происходит. Преимущество разделения проверки и первоначального создания ограничения заключается в том, что проверка блокирует таблицу меньше, чем создание ограничения.
  • ADD table_constraint_using_index — Добавляет новое ограничение PRIMARY KEY или UNIQUE к таблице на основе существующего уникального индекса. Все столбцы индекса будут включены в ограничение. Индекс не может содержать выражения или быть частичным. Кроме того, он должен быть B-деревом с порядком сортировки по умолчанию. Эти ограничения гарантируют, что индекс эквивалентен тому, который создаётся стандартными командами ADD PRIMARY KEY или ADD UNIQUE. Для секционированных таблиц добавление ограничения PRIMARY KEY или UNIQUE на основе существующего уникального индекса не поддерживается. Если указано PRIMARY KEY, и столбцы индекса ещё не помечены как NOT NULL, команда попытается выполнить ALTER COLUMN SET NOT NULL для каждого такого столбца. Это требует полного сканирования таблицы для проверки отсутствия NULL-значений. Во всех остальных случаях это быстрая операция. Если указано имя ограничения, индекс будет переименован, чтобы соответствовать имени ограничения. В противном случае ограничение получит имя индекса. После выполнения этой команды индекс будет «принадлежать» ограничению, как если бы он был создан с помощью обычных команд ADD PRIMARY KEY или ADD UNIQUE. В частности, удаление ограничения приведёт также к исчезновению индекса.
    Примечания: Если вам нужно добавить новое ограничение, не блокируя обновления таблицы долгое время, может быть полезно добавить ограничение с использованием существующего индекса. Для этого создайте индекс с помощью CREATE INDEX CONCURRENTLY, а затем установите его как формальное ограничение с помощью данного синтаксиса. См. пример ниже.
  • DROP CONSTRAINT [IF EXISTS] — Удаляет указанное ограничение из таблицы. Если указано IF EXISTS, и ограничение не существует, ошибка не возникает. В этом случае выдается уведомление.
  • DISABLE/ENABLE TRIGGER — Отключает или включает триггеры, принадлежащие этой таблице. Отключённые триггеры остаются известны системе, но не выполняются при наступлении событий. Для отложенных триггеров состояние включённости проверяется в момент наступления события, а не при фактическом выполнении функции триггера. Можно отключить или включить один триггер по имени, все триггеры таблицы или только пользовательские триггеры. Отключение или включение триггеров ограничений требует прав суперпользователя.
    Примечания: Триггеры не поддерживаются в базе данных YMatrix. Из-за параллельной природы базы данных YMatrix функциональность триггеров обычно очень ограничена.
  • CLUSTER ON/SET WITHOUT CLUSTER — Выбирает или удаляет индекс по умолчанию для будущих операций CLUSTER. Фактическое перегруппирование таблицы не производится. Примечания: Рекомендуется не использовать CLUSTER для физического упорядочивания таблиц в базах данных YMatrix, так как это занимает много времени. Лучше использовать CREATE TABLE AS для повторного создания таблицы и сортировки по столбцу индекса.
    Примечания: Таблицы с оптимизацией добавления не поддерживают CLUSTER ON.
  • SET WITHOUT OIDS — Удаляет системный столбец OID из таблицы.
  • SET ( FILLFACTOR = value) / RESET (FILLFACTOR) — Изменяет коэффициент заполнения таблицы. Коэффициент заполнения — процент от 10 до 100. Значение по умолчанию — 100 (полностью заполнено). При меньшем коэффициенте операции INSERT заполняют страницы таблицы только до указанного процента; оставшееся пространство на каждой странице зарезервировано для обновления строк на этой странице. Это позволяет операциям UPDATE размещать обновлённую копию строки на той же странице, что и оригинальная, что эффективнее, чем размещение на другой странице. Для таблиц, строки которых никогда не обновляются, полное заполнение — лучший выбор, но для часто обновляемых таблиц подходит меньший коэффициент. Обратите внимание, что эта команда не изменяет содержимое таблицы немедленно. Вам нужно перезаписать таблицу, чтобы достичь желаемого эффекта. Это можно сделать с помощью VACUUM или одной из форм ALTER TABLE, которые заставляют перезаписать таблицу.
  • SET DISTRIBUTED — Изменяет стратегию распределения таблицы. Изменение стратегии хэширования или переход к стратегии репликации (или обратно) приведёт к физическому перераспределению данных таблицы на диске, что может потребовать значительных ресурсов.
  • INHERIT parent_table / NO INHERIT parent_table — Добавляет или удаляет целевую таблицу как дочернюю таблицу указанной родительской таблицы. Запросы к родительской таблице будут включать записи из её дочерних таблиц. Чтобы стать дочерней, целевая таблица должна уже содержать все те же столбцы, что и родительская (может иметь дополнительные столбцы). Эти столбцы должны иметь совпадающие типы данных, и если в родительской таблице они имеют ограничения NOT NULL, то и в дочерней они тоже должны иметь такие ограничения. Для всех проверочных ограничений родительской таблицы должны существовать соответствующие ограничения и в дочерней таблице, кроме тех, которые помечены как ненаследуемые в родительской таблице (т.е. созданы с помощью 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 — Изменяет имя таблицы (или индекса, последовательности, представления), имя одного столбца в таблице или имя ограничения в таблице. Это не влияет на хранимые данные. Обратите внимание, что столбцы распределения базы данных YMatrix нельзя переименовывать.
  • SET SCHEMA — Перемещает таблицу в другую схему. Связанные индексы, ограничения и последовательности, принадлежащие столбцам таблицы, также перемещаются.
  • SET SEGMENT_SET — Изменяет объект SEGMENT_SET секционированной таблицы.
  • ALTER PARTITION | DROP PARTITION | RENAME PARTITION | TRUNCATE PARTITION | ADD PARTITION | SPLIT PARTITION | EXCHANGE PARTITION | SET SUBPARTITION TEMPLATE — Изменяет структуру секционированной таблицы. В большинстве случаев необходимо обращаться к родительской таблице, чтобы изменить одну из её дочерних партиций.

Примечания: Если вы добавляете партицию в таблицу с кодированием подразделов, новая партиция наследует инструкции хранения этого подраздела.

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

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

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

Параметры

ONLY

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

Примечания: Вы можете добавлять или удалять столбцы или изменять типы столбцов только в родительской таблице или дочерних таблицах. Родительская таблица и её потомки всегда должны иметь одинаковые столбцы и типы.

name

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

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

column_name

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

new_column_name

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

new_name

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

type

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

table_constraint

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

constraint_name

  • Имя существующего ограничения, которое нужно удалить.

CASCADE

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

RESTRICT

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

trigger_name

  • Имя отдельного триггера, который нужно отключить или включить. Обратите внимание, что база данных YMatrix не поддерживает триггеры.

ALL

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

USER

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

index_name

  • Имя индекса, который должен быть помечен как кластерный для таблицы. Примечания: Рекомендуется не использовать CLUSTER для физического упорядочивания таблиц в базах данных YMatrix, так как это занимает много времени. Лучше использовать CREATE TABLE AS для повторного создания таблицы и сортировки по столбцу индекса.

FILLFACTOR

  • Устанавливает процент коэффициента заполнения таблицы.

value

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

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

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

REORGANIZE=true|false

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

parent_table

  • Родительская таблица, с которой нужно связать или разъединить данную таблицу.

new_owner

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

new_tablespace

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

new_schema

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

parent_table_name

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

ALTER [DEFAULT] 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 — Для партиций по диапазону определяет начальное значение диапазона. По умолчанию начальное значение включительно. Например, если указано начало «2016-01-01», партиция будет включать все даты, большие или равные «2016-01-01». Обычно тип данных выражения START совпадает с типом столбца ключа секционирования. Если нет, необходимо явно преобразовать его к ожидаемому типу.
  • END — Для партиций по диапазону определяет конечное значение диапазона. По умолчанию конечное значение исключительно. Например, если указано окончание «2016-02-01», партиция будет включать все даты, меньшие, но не равные «2016-02-01». Обычно тип данных выражения END совпадает с типом столбца ключа секционирования. Если нет, необходимо явно преобразовать его к ожидаемому типу.
  • WITH — Устанавливает параметры хранения для секционированной таблицы. Например, вы можете хранить старые партиции как append-optimized таблицы, а новые — как обычные heap-таблицы. Подробности см. в CREATE TABLE.
  • TABLESPACE — Имя табличного пространства, в котором будет создана секционированная таблица.
  • subpartition_spec — Схема секционирования, которая может быть создана только при отсутствии шаблона подпартиций. Указывает спецификацию подпартиций для новой партиции. Если таблица изначально была определена с шаблоном подпартиций, этот шаблон будет использоваться для автоматического создания подпартиций.
  • SEGMENT_SET — Указывает объект SEGMENT_SET для новой партиции.

EXCHANGE [DEFAULT] PARTITION

  • Обменивает другую таблицу в иерархии секционирования, заменяя позицию существующей партиции. В многомерной схеме секционирования можно обменивать только партицию нижнего уровня (содержащую данные).
  • Параметр конфигурации сервера YMatrix gp_enable_exchange_default_partition управляет доступностью предложения EXCHANGE DEFAULT PARTITION. Значение по умолчанию — off. Если это предложение указано в команде ALTER TABLE, база данных YMatrix вернёт ошибку.
  • Примечания: Перед заменой партиции по умолчанию необходимо убедиться, что данные в таблице для замены (новая партиция по умолчанию) корректны для партиции по умолчанию. Например, данные в новой партиции по умолчанию не должны содержать данные, подходящие для других листовых партиций секционированной таблицы. В противном случае запросы к секционированной таблице с заменённой партицией по умолчанию, выполняемые 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

  • Имя указанной партиции.

FOR (RANK(number))

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

FOR (‘value’)

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

Примечания

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

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

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

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

При добавлении столбца с помощью ADD COLUMN все существующие строки в таблице инициализируются значением по умолчанию для этого столбца. Если предложение DEFAULT не указано, значение инициализируется как NULL. Добавление столбца со значением по умолчанию, отличным от NULL, или изменение типа существующего столбца потребует перезаписи всей таблицы и индексов. Исключение составляет случай, когда выражение USING не изменяет содержимое столбца, а старый тип может быть преобразован в новый тип или новый тип является неограниченным — в этом случае перезапись таблицы не требуется, однако все индексы по затронутому столбцу всё равно необходимо перестроить. Добавление или удаление системных столбцов OID также требует полной перезаписи таблицы. Для больших таблиц перестроение таблицы и индексов может занять значительное время и временно потребовать до двойного объёма дискового пространства.

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

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

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

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

Опция 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 для столбца.
  • Добавление или удаление ограничений.
  • Разделение внешней секции.

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

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

Пример

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

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;

Изменение объекта SEGMENT_SET уже созданной секционированной таблицы:

## Create SEGMENT_SET objects ss1 and ss2 in a three-node cluster
CREATE SEGMENT_SET ss1 SEGMENTS(‘0,2’);
CREATE SEGMENT_SET ss2 SEGMENTS(‘1,2’);

## Create regular table t1 and partitioned table t2
CREATE TABLE t1(a int, b int) DISTRIBUTED BY(a) SEGMENT_SET ss1;
CREATE TABLE t2(a int, b int) DISTRIBUTED BY(a) PARTITION BY RANGE(b) (DEFAULT PARTITION others SEGMENT_SET ss1);

# Modify the SEGMENT_SET object of the regular table t1.
ALTER TABLE t1 SET SEGMENT_SET ss2;

## Modify the SEGMENT_SET object of the partitioned table t2. The SEGMENT_SET of all subpartitions of t2 will also be modified.
ALTER TABLE t2 SET SEGMENT_SET ss2;

Изменение SEGMENT_SET конкретной секции:

ALTER TABLE t2_prt_1_others SET SEGMENT_SET ss1;
ALTER TABLE t2 ALTER DEFAULT PARTITION SET SEGMENT_SET ss1;

Указание объекта SEGMENT_SET для новой секции:

ALTER TABLE t2 ADD PARTITION START(6) END(10) SEGMENT_SET ss2;

Добавление новой секции в секционированную таблицу:

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), чтобы добавить новые ежемесячные секции за январь 2017 года:

ALTER TABLE sales SPLIT DEFAULT PARTITION 
START (‘2017-01-01’) INCLUSIVE 
END (‘2017-02-01’) EXCLUSIVE 
INTO (PARTITION jan09, PARTITION other);

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

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

Чтобы воссоздать ограничение первичного ключа без блокировки обновлений во время перестройки индекса:

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 t SET (encodechain=auto);

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

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

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

См. также

CREATE TABLE, DROP TABLE