Перейти к основному содержимому
Версия: 2.0.x

ALTER TABLE

ALTER TABLE изменяет существующую таблицу, включая:

подсказка

Эта операция требует привилегию ALTER на целевой таблице.

Синтаксис

ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]

alter_clause может выполнять следующие операции: rename, comment, partition, bucket, column, rollup, index, table property, swap и compaction.

  • rename: переименование таблицы, rollup, раздела или столбца (поддерживается начиная с v1.5.2).
  • comment: изменение комментария к таблице (поддерживается начиная с v1.5.2).
  • partition: изменение свойств раздела, удаление раздела или добавление раздела.
  • bucket: изменение метода bucketing и количества buckets.
  • column: добавление, удаление или переупорядочивание столбцов, изменение типа столбца или комментария
  • rollup: создание или удаление rollup.
  • index: изменение индексов.
  • swap: атомарный обмен двух таблиц.
  • compaction: выполнение ручного сжатия для объединения версий загруженных данных (поддерживается начиная с v1.5.2).
  • drop persistent index: Удаление persistent index для таблицы с Primary Key в shared-data кластере (поддерживается начиная с v1.5.2).

Ограничения и примечания по использованию

  • Операции с разделами, столбцами и rollup индексами не могут быть выполнены в одном операторе ALTER TABLE.
  • Одна таблица может иметь только одну текущую операцию изменения схемы. Вы не можете запускать две команды изменения схемы для одной таблицы одновременно.
  • Операции с bucket, column и rollup являются асинхронными операциями. Сообщение об успехе возвращается сразу после отправки задачи. Вы можете выполнить команду SHOW ALTER TABLE для проверки прогресса и команду CANCEL ALTER TABLE для отмены операции.
  • Операции с rename, comment, partition, index и swap являются синхронными операциями, и возврат команды означает завершение выполнения.

Rename

Rename поддерживает изменение имени таблицы, rollup и имени раздела.

Переименование таблицы

ALTER TABLE <tbl_name> RENAME <new_tbl_name>

Переименование rollup

ALTER TABLE [<db_name>.]<tbl_name>
RENAME ROLLUP <old_rollup_name> <new_rollup_name>

Переименование раздела

ALTER TABLE [<db_name>.]<tbl_name>
RENAME PARTITION <old_partition_name> <new_partition_name>

Переименование столбца

Начиная с версии v1.5.2, Selena поддерживает переименование столбцов.

ALTER TABLE [<db_name>.]<tbl_name>
RENAME COLUMN <old_col_name> [ TO ] <new_col_name>
примечание
  • После переименования столбца с A на B добавление нового столбца с именем A не поддерживается.
  • Материализованные представления, построенные на переименованном столбце, не будут работать. Вы должны пересоздать их для столбца с новым именем.

Alter table comment (from v1.5.2)

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name> COMMENT = "<new table comment>";

Modify partition

ADD PARTITION(S)

Вы должны строго следовать соответствующему синтаксису для добавления range разделов или list разделов.

примечание
  • Добавление expression разделов не поддерживается.
  • Обратите внимание, что PARTITION BY date_trunc(column) и PARTITION BY time_slice(column) считаются range разделением, несмотря на их формат expression разделения. Поэтому вы можете использовать следующий синтаксис для range разделов для добавления новых разделов в таблицы, использующие такие стратегии разделения.

Синтаксис:

  • Range разделы

    ALTER TABLE
    ADD { single_range_partition | multi_range_partitions } [distribution_desc] ["key"="value"];

    single_range_partition ::=
    PARTITION [IF NOT EXISTS] <partition_name> VALUES partition_key_desc

    partition_key_desc ::=
    { LESS THAN { MAXVALUE | value_list }
    | [ value_list , value_list ) } -- Обратите внимание, что [ представляет левый закрытый интервал.

    value_list ::=
    ( <value> [, ...] )

    multi_range_partitions ::=
    { PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
    | PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- Значения столбца раздела все равно должны быть заключены в двойные кавычки, даже если значения столбца раздела, указанные START и END, являются целыми числами. Однако значения интервала в предложении EVERY не нужно заключать в двойные кавычки.
  • List разделы

    ALTER TABLE
    ADD PARTITION <partition_name> VALUES IN (value_list) [distribution_desc] ["key"="value"];

    value_list ::=
    value_item [, ...]

    value_item ::=
    { <value> | ( <value> [, ...] ) }

Параметры:

  • Параметры, связанные с разделами:

    • Для range разделов вы можете добавить один range раздел (single_range_partition) или несколько range разделов пакетно (multi_range_partitions).
    • Для list разделов вы можете добавить только один list раздел.
  • distribution_desc:

    Вы можете установить количество buckets для нового раздела отдельно, но не можете установить метод bucketing отдельно.

  • "key"="value":

    Вы можете установить свойства для нового раздела. Для получения подробной информации см. CREATE TABLE.

Примеры:

  • Range разделы

    • Если столбец раздела указан как event_day при создании таблицы, например PARTITION BY RANGE(event_day), и после создания таблицы нужно добавить новый раздел, вы можете выполнить:

      ALTER TABLE site_access ADD PARTITION p4 VALUES LESS THAN ("2020-04-30");
    • Если столбец раздела указан как datekey при создании таблицы, например PARTITION BY RANGE (datekey), и после создания таблицы нужно добавить несколько разделов пакетно, вы можете выполнить:

      ALTER TABLE site_access
      ADD PARTITIONS START ("2021-01-05") END ("2021-01-10") EVERY (INTERVAL 1 DAY);
  • List разделы

    • Если при создании таблицы указан один столбец раздела, например PARTITION BY LIST (city), и после создания таблицы нужно добавить новый раздел, вы можете выполнить:

      ALTER TABLE t_recharge_detail2
      ADD PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego");
    • Если при создании таблицы указано несколько столбцов раздела, например PARTITION BY LIST (dt,city), и после создания таблицы нужно добавить новый раздел, вы можете выполнить:

      ALTER TABLE t_recharge_detail4
      ADD PARTITION p202204_California VALUES IN
      (
      ("2022-04-01", "Los Angeles"),
      ("2022-04-01", "San Francisco"),
      ("2022-04-02", "Los Angeles"),
      ("2022-04-02", "San Francisco")
      );

DROP PARTITION(S)

  • Удалить один раздел:
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [ IF EXISTS ] <partition_name> [ FORCE ]
  • Удалить разделы пакетно (Поддерживается с v1.5.2):
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITIONS [ IF EXISTS ] { partition_name_list | multi_range_partitions } [ FORCE ]

partition_name_list ::= ( <partition_name> [, ... ] )

multi_range_partitions ::=
{ START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
| START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- Значения столбца раздела все равно должны быть заключены в двойные кавычки, даже если значения столбца раздела являются целыми числами. Однако значения интервала в предложении EVERY не нужно заключать в двойные кавычки.

Примечания для multi_range_partitions:

  • Применяется только к Range разделению.

  • Используемые параметры соответствуют параметрам в ADD PARTITION(S).

  • Поддерживает только разделы с одним Partition Key.

  • Удалить разделы с Common Partition Expression (Поддерживается с v1.5.2):

ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITIONS WHERE <expr>

Начиная с версии v1.5.2, Selena поддерживает удаление разделов с помощью Common Partition Expression. Вы можете указать предложение WHERE с выражением для фильтрации разделов для удаления.

  • Выражение объявляет разделы, которые будут удалены. Разделы, соответствующие условию в выражении, будут удалены пакетно. Будьте осторожны при продолжении.
  • Выражение может содержать только столбцы раздела и константы. Столбцы, не являющиеся столбцами раздела, не поддерживаются.
  • Common Partition Expression применяется к List разделам и Range разделам по-разному:
    • Для таблиц с List разделами Selena поддерживает удаление разделов, отфильтрованных Common Partition Expression.
    • Для таблиц с Range разделами Selena может фильтровать и удалять разделы только с использованием возможности partition pruning FE. Разделы, соответствующие предикатам, которые не поддерживаются partition pruning, не могут быть отфильтрованы и удалены.

Пример:

-- Удалить данные старше трех последних месяцев. Столбец `dt` является столбцом раздела таблицы.
ALTER TABLE t1 DROP PARTITIONS WHERE dt < CURRENT_DATE() - INTERVAL 3 MONTH;
примечание
  • Сохраните хотя бы один раздел для разделенных таблиц.
  • Если FORCE не указан, вы можете восстановить удаленные разделы с помощью команды RECOVER в течение указанного периода (по умолчанию 1 день).
  • Если FORCE указан, разделы будут удалены напрямую, независимо от того, есть ли незавершенные операции с разделами, и они не могут быть восстановлены. Таким образом, эта операция обычно не рекомендуется.

Добавить временный раздел

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD TEMPORARY PARTITION [IF NOT EXISTS] <partition_name>
{ single_range_partition | multi_range_partitions | list_partitions }
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]]

-- Для получения подробной информации о single_range_partition и multi_range_partitions см. раздел ADD PARTITION(S) на этой странице.

list_partitions::=
PARTITION <partition_name> VALUES IN (value_list)

value_list ::=
value_item [, ...]

value_item ::=
{ <value> | ( <value> [, ...] ) }

Использовать временный раздел для замены текущего раздела

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
REPLACE PARTITION <partition_name>
partition_desc ["key"="value"]
WITH TEMPORARY PARTITION
partition_desc ["key"="value"]
[PROPERTIES ("key"="value", ...)]

Удалить временный раздел

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP TEMPORARY PARTITION <partition_name>

Изменить свойства раздела

Синтаксис

ALTER TABLE [<db_name>.]<tbl_name>
MODIFY PARTITION { <partition_name> | ( <partition1_name> [, <partition2_name> ...] ) | (*) }
SET ("key" = "value", ...);

Использование

  • Следующие свойства раздела могут быть изменены:

    • storage_medium
    • storage_cooldown_ttl или storage_cooldown_time
    • replication_num
  • Для таблицы, которая имеет только один раздел, имя раздела совпадает с именем таблицы. Если таблица разделена на несколько разделов, вы можете использовать (*) для изменения свойств всех разделов, что более удобно.

  • Выполните SHOW PARTITIONS FROM <tbl_name> для просмотра свойств раздела после изменения.

Modify the bucketing method and number of buckets (from v1.5.2)

Синтаксис:

ALTER TABLE [<db_name>.]<table_name>
[ partition_names ]
[ distribution_desc ]

partition_names ::=
(PARTITION | PARTITIONS) ( <partition_name> [, <partition_name> ...] )

distribution_desc ::=
DISTRIBUTED BY RANDOM [ BUCKETS <num> ] |
DISTRIBUTED BY HASH ( <column_name> [, <column_name> ...] ) [ [ DEFAULT ] BUCKETS <num> ]

Пример:

Например, исходная таблица - это таблица Duplicate Key, где используется hash bucketing, а количество buckets автоматически устанавливается Selena.

CREATE TABLE IF NOT EXISTS details (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
device_code INT COMMENT "device code",
channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type)
PARTITION BY date_trunc('day', event_time)
DISTRIBUTED BY HASH(user_id);

-- Вставить данные за несколько дней
INSERT INTO details (event_time, event_type, user_id, device_code, channel) VALUES
-- Данные 26 ноября
('2023-11-26 08:00:00', 1, 101, 12345, 2),
('2023-11-26 09:15:00', 2, 102, 54321, 3),
('2023-11-26 10:30:00', 1, 103, 98765, 1),
-- Данные 27 ноября
('2023-11-27 08:30:00', 1, 104, 11111, 2),
('2023-11-27 09:45:00', 2, 105, 22222, 3),
('2023-11-27 11:00:00', 1, 106, 33333, 1),
-- Данные 28 ноября
('2023-11-28 08:00:00', 1, 107, 44444, 2),
('2023-11-28 09:15:00', 2, 108, 55555, 3),
('2023-11-28 10:30:00', 1, 109, 66666, 1);

Изменить только метод bucketing

УВЕДОМЛЕНИЕ

  • Изменение применяется ко всем разделам в таблице и не может быть применено только к конкретным разделам.
  • Хотя нужно изменить только метод bucketing, количество buckets все равно нужно указать в команде с помощью BUCKETS <num>. Если BUCKETS <num> не указан, это означает, что количество buckets автоматически определяется Selena.
  • Метод bucketing изменяется на random bucketing с hash bucketing, и количество buckets остается автоматически установленным Selena.

    ALTER TABLE details DISTRIBUTED BY RANDOM;
  • Ключи для hash bucketing изменяются на user_id, event_time с event_time, event_type. И количество buckets остается автоматически установленным Selena.

    ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time);

Изменить только количество buckets

УВЕДОМЛЕНИЕ

Хотя нужно изменить только количество buckets, метод bucketing все равно нужно указать в команде, например, HASH(user_id).

  • Изменить количество buckets для всех разделов на 10 с автоматически установленного Selena.

    ALTER TABLE details DISTRIBUTED BY HASH(user_id) BUCKETS 10;
  • Изменить количество buckets по умолчанию для таблицы на 10 с автоматически установленного Selena без изменения количества для существующих разделов (поддерживается начиная с v1.5.2 и v2.0.0).

    ALTER TABLE details DISTRIBUTED BY HASH(user_id) DEFAULT BUCKETS 10;

    УВЕДОМЛЕНИЕ

    Вы не можете указать одновременно partition_names и DEFAULT.

  • Изменить количество buckets для указанных разделов на 15 с автоматически установленного Selena.

    ALTER TABLE details PARTITIONS (p20231127, p20231128) DISTRIBUTED BY HASH(user_id) BUCKETS 15 ;

    ПРИМЕЧАНИЕ

    Имена разделов можно просмотреть, выполнив SHOW PARTITIONS FROM <table_name>;.

Изменить как метод bucketing, так и количество buckets

УВЕДОМЛЕНИЕ

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

  • Изменить метод bucketing с hash bucketing на random bucketing и изменить количество buckets на 10 с автоматически установленного Selena.

    ALTER TABLE details DISTRIBUTED BY RANDOM BUCKETS 10;
  • Изменить ключ для hash bucketing и изменить количество buckets на 10 с автоматически установленного Selena. Ключ, используемый для hashing bucketing, изменяется на user_id, event_time с исходного event_time, event_type. Количество buckets изменяется на 10 с автоматически установленного Selena.

    ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time) BUCKETS 10;
    ``

Modify columns (add/delete columns, change column order, modify column comment)

Добавить столбец в указанное место указанного индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]

Примечание:

  1. Если вы добавляете столбец значения в таблицу Aggregate, вам нужно указать agg_type.
  2. Если вы добавляете ключевой столбец в таблицу, отличную от Aggregate (например, таблицу Duplicate Key), вам нужно указать ключевое слово KEY.
  3. Вы не можете добавить столбец, который уже существует в базовом индексе, в rollup. (Вы можете пересоздать rollup при необходимости.)

Добавить несколько столбцов в указанный индекс

Синтаксис:

  • Добавить несколько столбцов

    ALTER TABLE [<db_name>.]<tbl_name>
    ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
    [TO rollup_index_name]
    [PROPERTIES ("key"="value", ...)]
  • Добавить несколько столбцов и использовать AFTER для указания расположения добавленных столбцов

    ALTER TABLE [<db_name>.]<tbl_name>
    ADD COLUMN column_name1 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name,
    ADD COLUMN column_name2 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name
    [, ...]
    [TO rollup_index_name]
    [PROPERTIES ("key"="value", ...)]

Примечание:

  1. Если вы добавляете столбец значения в таблицу Aggregate, вам нужно указать agg_type.

  2. Если вы добавляете ключевой столбец в таблицу, отличную от Aggregate, вам нужно указать ключевое слово KEY.

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

Добавить generated столбец (from v1.5.2)

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN col_name data_type [NULL] AS generation_expr [COMMENT 'string']

Вы можете добавить generated столбец и указать его выражение. Generated столбец может использоваться для предварительного вычисления и хранения результатов выражений, что значительно ускоряет запросы с одинаковыми сложными выражениями. Начиная с версии v1.5.2, Selena поддерживает generated столбцы.

Удалить столбец из указанного индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP COLUMN column_name
[FROM rollup_index_name];

Примечание:

  1. Вы не можете удалить столбец раздела.
  2. Если столбец удален из базового индекса, он также будет удален, если он включен в rollup.

Изменить тип столбца, позицию, комментарий и другие свойства

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
MODIFY COLUMN <column_name>
[ column_type [ KEY | agg_type ] ] [ NULL | NOT NULL ]
[ DEFAULT "<default_value>"] [ COMMENT "<new_column_comment>" ]
[ AFTER <column_name> | FIRST ]
[ FROM rollup_index_name ]
[ PROPERTIES ("key"="value", ...) ]

Примечание:

  1. Если вы изменяете столбец значения в агрегатных моделях, вам нужно указать agg_type.

  2. Если вы изменяете ключевой столбец в неагрегатных моделях, вам нужно указать ключевое слово KEY.

  3. Может быть изменен только тип столбца. Другие свойства столбца остаются такими, какими они являются в настоящее время. (т.е. другие свойства должны быть явно написаны в операторе в соответствии с исходным свойством, см. пример 8 в части column).

  4. Столбец раздела не может быть изменен.

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

    • Преобразование TINYINT/SMALLINT/INT/BIGINT в TINYINT/SMALLINT/INT/BIGINT/DOUBLE.
    • Преобразование TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL в VARCHAR. VARCHAR поддерживает изменение максимальной длины.
    • Преобразование VARCHAR в TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE.
    • Преобразование VARCHAR в DATE (в настоящее время поддерживается шесть форматов: "%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d, "%y/%m/%d")
    • Преобразование DATETIME в DATE (сохраняется только информация о годе-месяце-дне, т.е. 2019-12-09 21:47:05 <--> 2019-12-09)
    • Преобразование DATE в DATETIME (часы, минуты, секунды устанавливаются в ноль, например: 2019-12-09 <--> 2019-12-09 00:00:00)
    • Преобразование FLOAT в DOUBLE
    • Преобразование INT в DATE (Если данные INT не удается преобразовать, исходные данные остаются прежними)
  6. Преобразование из NULL в NOT NULL не поддерживается.

  7. Вы можете изменить несколько свойств в одном предложении MODIFY COLUMN. Однако некоторые комбинации свойств не поддерживаются.

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

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]

Примечание:

  • Все столбцы в индексе должны быть написаны.
  • Столбец значения указан после ключевого столбца.

Изменить ключ сортировки

Начиная с версии v1.5.2, ключи сортировки для таблиц с Primary Key могут быть изменены. v1.5.2 расширяет эту поддержку на таблицы Duplicate Key, таблицы Aggregate и таблицы Unique Key.

Ключи сортировки в таблицах Duplicate Key и таблицах Primary Key могут быть комбинацией любых столбцов сортировки. Ключи сортировки в таблицах Aggregate и таблицах Unique Key должны включать все ключевые столбцы, но порядок столбцов не обязательно должен быть таким же, как у ключевых столбцов.

Синтаксис:

ALTER TABLE [<db_name>.]<table_name>
[ order_desc ]

order_desc ::=
ORDER BY <column_name> [, <column_name> ...]

Пример: изменить ключи сортировки в таблицах с Primary Key.

Например, исходная таблица - это таблица Primary Key, где ключ сортировки и первичный ключ связаны, что составляет dt, order_id.

create table orders (
dt date NOT NULL,
order_id bigint NOT NULL,
user_id int NOT NULL,
merchant_id int NOT NULL,
good_id int NOT NULL,
good_name string NOT NULL,
price int NOT NULL,
cnt int NOT NULL,
revenue int NOT NULL,
state tinyint NOT NULL
) PRIMARY KEY (dt, order_id)
PARTITION BY date_trunc('day', dt)
DISTRIBUTED BY HASH(order_id);

Отделить ключ сортировки от первичного ключа и изменить ключ сортировки на dt, revenue, state.

ALTER TABLE orders ORDER BY (dt, revenue, state);

Изменить столбец STRUCT для добавления или удаления поля

Начиная с v1.5.2, Selena поддерживает изменение столбца STRUCT для добавления или удаления поля, которое может быть вложенным или находиться внутри типа ARRAY.

Синтаксис:

-- Добавить поле
ALTER TABLE [<db_name>.]<tbl_name> MODIFY COLUMN <column_name>
ADD FIELD field_path field_desc

-- Удалить поле
ALTER TABLE [<db_name>.]<tbl_name> MODIFY COLUMN <column_name>
DROP FIELD field_path

field_path ::= [ { <field_name>. | [*]. } [ ... ] ]<field_name>

-- Обратите внимание, что здесь `[*]` в целом является предопределенным символом и представляет все элементы в поле ARRAY
-- при добавлении или удалении поля в типе STRUCT, вложенном в тип ARRAY.
-- Для получения подробной информации см. описание параметра и примеры `field_path`.

field_desc ::= <field_type> [ AFTER <prior_field_name> | FIRST ]

Параметры:

  • field_path: Поле для добавления или удаления. Это может быть простое имя поля, указывающее на поле верхнего уровня, например, new_field_name, или Column Access Path, который представляет вложенное поле, например, lv1_k1.lv2_k2.[*].new_field_name.
  • [*]: Когда тип STRUCT вложен в тип ARRAY, [*] представляет все элементы в поле ARRAY. Используется для добавления или удаления поля во всех элементах STRUCT, вложенных в поле ARRAY.
  • prior_field_name: Поле, предшествующее вновь добавленному полю. Используется в сочетании с ключевым словом AFTER для указания порядка нового поля. Вам не нужно указывать этот параметр, если используется ключевое слово FIRST, указывающее, что новое поле должно быть первым полем. Размерность prior_field_name определяется field_path (в частности, частью, предшествующей new_field_name, то есть level1_k1.level2_k2.[*]) и не нужно указывать явно.

Примеры field_path:

  • Добавить или удалить подполе в поле STRUCT, вложенном в столбец STRUCT.

    Предположим, есть столбец fx stuct<c1 int, c2 struct <v1 int, v2 int>>. Синтаксис для добавления поля v3 под c2:

    ALTER TABLE tbl MODIFY COLUMN fx ADD FIELD c2.v3 INT

    После операции столбец становится fx stuct<c1 int, c2 struct <v1 int, v2 int, v3 int>>.

  • Добавить или удалить подполе в каждом поле STRUCT, вложенном в поле ARRAY.

    Предположим, есть столбец fx struct<c1 int, c2 array<struct <v1 int, v2 int>>>. Поле c2 - это тип ARRAY, который содержит STRUCT с двумя полями v1 и v2. Синтаксис для добавления поля v3 во вложенный STRUCT:

    ALTER TABLE tbl MODIFY COLUMN fx ADD FIELD c2.[*].v3 INT

    После операции столбец становится fx struct<c1 int, c2 array<struct <v1 int, v2 int, v3 int>>>.

Для получения дополнительных инструкций по использованию см. Пример - Столбец -14.

примечание
  • В настоящее время эта функция поддерживается только в shared-nothing кластерах.
  • Таблица должна иметь включенное свойство fast_schema_evolution.
  • Изменение типа Value подполя MAP в типе STRUCT не поддерживается, независимо от того, является ли тип Value ARRAY, STRUCT или MAP.
  • Вновь добавленные поля не могут иметь значения по умолчанию или атрибуты, такие как Nullable. Они по умолчанию являются Nullable со значением по умолчанию null.
  • После использования этой функции прямое понижение версии кластера до версии, которая не поддерживает эту функцию, не разрешается.

Modify rollup

Создать rollup

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)]

PROPERTIES: Поддержка установки timeout time, время ожидания по умолчанию составляет один день.

Пример:

ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP r1(col1,col2) from r0;

Создать rollups пакетно

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP [rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)],...];

Пример:

ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP r1(col1,col2) from r0, r2(col3,col4) from r0;

Примечание:

  1. Если from_index_name не указан, создается из базового индекса по умолчанию.
  2. Столбцы в таблице rollup должны быть существующими столбцами в from_index.
  3. В свойствах пользователь может указать формат хранения. Подробности см. в CREATE TABLE.

Удалить rollup

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP ROLLUP rollup_name [PROPERTIES ("key"="value", ...)];

Пример:

ALTER TABLE [<db_name>.]<tbl_name> DROP ROLLUP r1;

Пакетное удаление rollups

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP ROLLUP [rollup_name [PROPERTIES ("key"="value", ...)],...];

Пример:

ALTER TABLE [<db_name>.]<tbl_name> DROP ROLLUP r1, r2;

Примечание: Вы не можете удалить базовый индекс.

Modify indexes

Вы можете создавать или удалять следующие индексы:

Создать индекс

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD INDEX index_name (column) [USING { BITMAP | NGRAMBF | GIN | VECTOR } ] [COMMENT '<comment>']

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

Удалить индекс

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP INDEX index_name;

Modify table properties

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
SET ("key" = "value")

В настоящее время Selena поддерживает изменение следующих свойств таблицы:

  • replication_num
  • default.replication_num
  • default.storage_medium
  • Свойства, связанные с динамическим разделением
  • enable_persistent_index
  • bloom_filter_columns
  • colocate_with
  • bucket_size (поддерживается с 3.2)
  • base_compaction_forbidden_time_ranges (поддерживается с v1.5.2)
примечание
  • В большинстве случаев вам разрешено изменять только одно свойство за раз. Вы можете изменять несколько свойств одновременно только в том случае, если эти свойства имеют одинаковый префикс. В настоящее время поддерживаются только dynamic_partition. и binlog..
  • Вы также можете изменить свойства, объединив их в вышеуказанную операцию со столбцом. См. следующие примеры.

Swap

Swap поддерживает атомарный обмен двух таблиц.

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
SWAP WITH <tbl_name>;
примечание
  • Ограничения Unique Key и Foreign Key между таблицами OLAP будут проверяться во время Swap, чтобы убедиться, что ограничения двух обмениваемых таблиц согласованы. Ошибка будет возвращена, если обнаружены несоответствия. Если несоответствия не обнаружены, ограничения Unique Key и Foreign Key будут автоматически обменяны.
  • Материализованные представления, которые зависят от обмениваемых таблиц, будут автоматически установлены в неактивное состояние, и их ограничения Unique Key и Foreign Key будут удалены и больше не будут доступны.

Manual compaction (from 3.1)

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

До версии v1.5.2 сжатие выполнялось двумя способами:

  • Автоматическое сжатие системой: Сжатие выполняется на уровне BE в фоновом режиме. Пользователи не могут указать базу данных или таблицу для сжатия.
  • Пользователи могут выполнять сжатие, вызывая HTTP-интерфейс.

Начиная с версии v1.5.2, Selena предлагает SQL-интерфейс для пользователей для ручного выполнения сжатия путем выполнения SQL-команд. Они могут выбрать конкретную таблицу или раздел для сжатия. Это обеспечивает большую гибкость и контроль над процессом сжатия.

Shared-data кластеры поддерживают эту функцию начиная с v1.5.2.

ПРИМЕЧАНИЕ

Начиная с версии v1.5.2, вы можете запретить Base Compaction в определенном временном диапазоне, используя свойство base_compaction_forbidden_time_ranges.

Синтаксис:

ALTER TABLE <tbl_name> [ BASE | CUMULATIVE ] COMPACT [ <partition_name> | ( <partition1_name> [, <partition2_name> ...] ) ]

То есть:

-- Выполнить сжатие всей таблицы.
ALTER TABLE <tbl_name> COMPACT

-- Выполнить сжатие одного раздела.
ALTER TABLE <tbl_name> COMPACT <partition_name>

-- Выполнить сжатие нескольких разделов.
ALTER TABLE <tbl_name> COMPACT (<partition1_name>[,<partition2_name>,...])

-- Выполнить cumulative сжатие.
ALTER TABLE <tbl_name> CUMULATIVE COMPACT (<partition1_name>[,<partition2_name>,...])

-- Выполнить base сжатие.
ALTER TABLE <tbl_name> BASE COMPACT (<partition1_name>[,<partition2_name>,...])

Таблица be_compactions в базе данных information_schema записывает результаты сжатия. Вы можете выполнить SELECT * FROM information_schema.be_compactions; для запроса версий данных после сжатия.

Drop Primary Key Persistent Index (From 3.3.9)

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP PERSISTENT INDEX ON TABLETS(<tablet_id>[, <tablet_id>, ...]);

ПРИМЕЧАНИЕ

Selena поддерживает только удаление persistent индексов для облачных таблиц Primary Key в shared-data кластерах.

Примеры

Таблица

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

    ALTER TABLE example_db.my_table
    SET ("default.replication_num" = "2");
  2. Изменить фактическое количество реплик таблицы с одним разделом.

    ALTER TABLE example_db.my_table
    SET ("replication_num" = "3");
  3. Изменить режим записи данных и репликации между репликами.

    ALTER TABLE example_db.my_table
    SET ("replicated_storage" = "false");

    Этот пример устанавливает режим записи данных и репликации между репликами на "leaderless replication", что означает, что данные записываются в несколько реплик одновременно без различения первичных и вторичных реплик. Для получения дополнительной информации см. параметр replicated_storage в CREATE TABLE.

Раздел

  1. Добавить раздел и использовать метод bucketing по умолчанию. Существующий раздел - [MIN, 2013-01-01). Добавленный раздел - [2013-01-01, 2014-01-01).

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2014-01-01");
  2. Добавить раздел и использовать новое количество buckets.

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
    DISTRIBUTED BY HASH(k1);
  3. Добавить раздел и использовать новое количество реплик.

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
    ("replication_num"="1");
  4. Изменить количество реплик для раздела.

    ALTER TABLE example_db.my_table
    MODIFY PARTITION p1 SET("replication_num"="1");
  5. Пакетное изменение количества реплик для указанных разделов.

    ALTER TABLE example_db.my_table
    MODIFY PARTITION (p1, p2, p4) SET("replication_num"="1");
  6. Пакетное изменение носителя хранения всех разделов.

    ALTER TABLE example_db.my_table
    MODIFY PARTITION (*) SET("storage_medium"="HDD");
  7. Удалить раздел.

    ALTER TABLE example_db.my_table
    DROP PARTITION p1;
  8. Добавить раздел с верхней и нижней границами.

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES [("2014-01-01"), ("2014-02-01"));

Rollup

  1. Создать rollup example_rollup_index на основе базового индекса (k1,k2,k3,v1,v2). Используется column-based хранилище.

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index(k1, k3, v1, v2)
    PROPERTIES("storage_type"="column");
  2. Создать rollup example_rollup_index2 на основе example_rollup_index(k1,k3,v1,v2).

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index2 (k1, v1)
    FROM example_rollup_index;
  3. Создать rollup example_rollup_index3 на основе базового индекса (k1, k2, k3, v1). Время ожидания rollup установлено на один час.

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index3(k1, k3, v1)
    PROPERTIES("storage_type"="column", "timeout" = "3600");
  4. Удалить rollup example_rollup_index2.

    ALTER TABLE example_db.my_table
    DROP ROLLUP example_rollup_index2;

Столбец

  1. Добавить ключевой столбец new_col (неагрегатный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
    TO example_rollup_index;
  2. Добавить столбец значения new_col (неагрегатный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT DEFAULT "0" AFTER col1
    TO example_rollup_index;
  3. Добавить ключевой столбец new_col (агрегатный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT DEFAULT "0" AFTER col1
    TO example_rollup_index;
  4. Добавить столбец значения new_col SUM (агрегатный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
    TO example_rollup_index;
  5. Добавить несколько столбцов в example_rollup_index (агрегатный).

    ALTER TABLE example_db.my_table
    ADD COLUMN (col1 INT DEFAULT "1", col2 FLOAT SUM DEFAULT "2.3")
    TO example_rollup_index;
  6. Добавить несколько столбцов в example_rollup_index (агрегатный) и указать расположение добавленных столбцов с помощью AFTER.

    ALTER TABLE example_db.my_table
    ADD COLUMN col1 INT DEFAULT "1" AFTER `k1`,
    ADD COLUMN col2 FLOAT SUM AFTER `v2`,
    TO example_rollup_index;
  7. Удалить столбец из example_rollup_index.

    ALTER TABLE example_db.my_table
    DROP COLUMN col2
    FROM example_rollup_index;
  8. Изменить тип столбца col1 базового индекса на BIGINT и поместить его после col2.

    ALTER TABLE example_db.my_table
    MODIFY COLUMN col1 BIGINT DEFAULT "1" AFTER col2;
  9. Изменить максимальную длину столбца val1 базового индекса на 64. Исходная длина - 32.

    ALTER TABLE example_db.my_table
    MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc";
  10. Изменить порядок столбцов в example_rollup_index. Исходный порядок столбцов: k1, k2, k3, v1, v2.

    ALTER TABLE example_db.my_table
    ORDER BY (k3,k1,k2,v2,v1)
    FROM example_rollup_index;
  11. Выполнить две операции (ADD COLUMN и ORDER BY) одновременно.

    ALTER TABLE example_db.my_table
    ADD COLUMN v2 INT MAX DEFAULT "0" AFTER k2 TO example_rollup_index,
    ORDER BY (k3,k1,k2,v2,v1) FROM example_rollup_index;
  12. Изменить bloomfilter столбцы таблицы.

    ALTER TABLE example_db.my_table
    SET ("bloom_filter_columns"="k1,k2,k3");

    Эта операция также может быть объединена с вышеуказанной операцией со столбцом (обратите внимание, что синтаксис нескольких предложений немного отличается).

    ALTER TABLE example_db.my_table
    DROP COLUMN col2
    PROPERTIES ("bloom_filter_columns"="k1,k2,k3");
  13. Изменить тип данных нескольких столбцов в одном операторе.

    ALTER TABLE example_db.my_table
    MODIFY COLUMN k1 VARCHAR(100) KEY NOT NULL,
    MODIFY COLUMN v2 DOUBLE DEFAULT "1" AFTER v1;
  14. Добавить и удалить поля в данных типа STRUCT.

    Предварительные условия: Создать таблицу и вставить строку данных.

    CREATE TABLE struct_test(
    c0 INT,
    c1 STRUCT<v1 INT, v2 STRUCT<v4 INT, v5 INT>, v3 INT>,
    c2 STRUCT<v1 INT, v2 ARRAY<STRUCT<v3 INT, v4 STRUCT<v5 INT, v6 INT>>>>
    )
    DUPLICATE KEY(c0)
    DISTRIBUTED BY HASH(`c0`) BUCKETS 1
    PROPERTIES (
    "fast_schema_evolution" = "true"
    );
    INSERT INTO struct_test VALUES (
    1,
    ROW(1, ROW(2, 3), 4),
    ROW(5, [ROW(6, ROW(7, 8)), ROW(9, ROW(10, 11))])
    );
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v4":2,"v5":3},"v3":4}
    c2: {"v1":5,"v2":[{"v3":6,"v4":{"v5":7,"v6":8}},{"v3":9,"v4":{"v5":10,"v6":11}}]}
    • Добавить новое поле в столбец типа STRUCT.
    ALTER TABLE struct_test MODIFY COLUMN c1 ADD FIELD v4 INT AFTER v2;
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v4":2,"v5":3},"v4":null,"v3":4}
    c2: {"v1":5,"v2":[{"v3":6,"v4":{"v5":7,"v6":8}},{"v3":9,"v4":{"v5":10,"v6":11}}]}
    • Добавить новое поле во вложенный тип STRUCT.
    ALTER TABLE struct_test MODIFY COLUMN c1 ADD FIELD v2.v6 INT FIRST;
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v6":null,"v4":2,"v5":3},"v4":null,"v3":4}
    c2: {"v1":5,"v2":[{"v3":6,"v4":{"v5":7,"v6":8}},{"v3":9,"v4":{"v5":10,"v6":11}}]}
    • Добавить новое поле в тип STRUCT в массиве.
    ALTER TABLE struct_test MODIFY COLUMN c2 ADD FIELD v2.[*].v7 INT AFTER v3;
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v6":null,"v4":2,"v5":3},"v4":null,"v3":4}
    c2: {"v1":5,"v2":[{"v3":6,"v7":null,"v4":{"v5":7,"v6":8}},{"v3":9,"v7":null,"v4":{"v5":10,"v6":11}}]}
    • Удалить поле из столбца типа STRUCT.
    ALTER TABLE struct_test MODIFY COLUMN c1 DROP FIELD v3;
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v6":null,"v4":2,"v5":3},"v4":null}
    c2: {"v1":5,"v2":[{"v3":6,"v7":null,"v4":{"v5":7,"v6":8}},{"v3":9,"v7":null,"v4":{"v5":10,"v6":11}}]}
    • Удалить поле из вложенного типа STRUCT.
    ALTER TABLE struct_test MODIFY COLUMN c1 DROP FIELD v2.v4;
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v6":null,"v5":3},"v4":null}
    c2: {"v1":5,"v2":[{"v3":6,"v7":null,"v4":{"v5":7,"v6":8}},{"v3":9,"v7":null,"v4":{"v5":10,"v6":11}}]}
    • Удалить поле из типа STRUCT в массиве.
    ALTER TABLE struct_test MODIFY COLUMN c2 DROP FIELD v2.[*].v3;
    mysql> SELECT * FROM struct_test\G
    *************************** 1. row ***************************
    c0: 1
    c1: {"v1":1,"v2":{"v6":null,"v5":3},"v4":null}
    c2: {"v1":5,"v2":[{"v7":null,"v4":{"v5":7,"v6":8}},{"v7":null,"v4":{"v5":10,"v6":11}}]}

Свойство таблицы

  1. Изменить свойство Colocate таблицы.

    ALTER TABLE example_db.my_table
    SET ("colocate_with" = "t1");
  2. Изменить свойство динамического раздела таблицы.

    ALTER TABLE example_db.my_table
    SET ("dynamic_partition.enable" = "false");

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

    ALTER TABLE example_db.my_table
    SET (
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.buckets" = "32"
    );
  3. Изменить свойство носителя хранения таблицы.

    ALTER TABLE example_db.my_table SET("default.storage_medium"="SSD");

Переименование

  1. Переименовать table1 в table2.

    ALTER TABLE table1 RENAME table2;
  2. Переименовать rollup rollup1 таблицы example_table в rollup2.

    ALTER TABLE example_table RENAME ROLLUP rollup1 rollup2;
  3. Переименовать раздел p1 таблицы example_table в p2.

    ALTER TABLE example_table RENAME PARTITION p1 p2;

Индекс

  1. Создать bitmap индекс для столбца siteid в table1.

    ALTER TABLE table1
    ADD INDEX index_1 (siteid) USING BITMAP COMMENT 'site_id_bitmap';
  2. Удалить bitmap индекс столбца siteid в table1.

    ALTER TABLE table1
    DROP INDEX index_1;

Swap

Атомарный обмен между table1 и table2.

ALTER TABLE table1 SWAP WITH table2

Ручное сжатие

CREATE TABLE compaction_test(
event_day DATE,
pv BIGINT)
DUPLICATE KEY(event_day)
PARTITION BY date_trunc('month', event_day)
DISTRIBUTED BY HASH(event_day) BUCKETS 8
PROPERTIES("replication_num" = "3");

INSERT INTO compaction_test VALUES
('2023-02-14', 2),
('2033-03-01',2);
{'label':'insert_734648fa-c878-11ed-90d6-00163e0dcbfc', 'status':'VISIBLE', 'txnId':'5008'}

INSERT INTO compaction_test VALUES
('2023-02-14', 2),('2033-03-01',2);
{'label':'insert_85c95c1b-c878-11ed-90d6-00163e0dcbfc', 'status':'VISIBLE', 'txnId':'5009'}

ALTER TABLE compaction_test COMPACT;

ALTER TABLE compaction_test COMPACT p203303;

ALTER TABLE compaction_test COMPACT (p202302,p203303);

ALTER TABLE compaction_test CUMULATIVE COMPACT (p202302,p203303);

ALTER TABLE compaction_test BASE COMPACT (p202302,p203303);

Удаление Primary Key Persistent Index

Удалить persistent индекс на tablets 100 и 101 для таблицы Primary Key db1.test_tbl в shared-data кластере.

ALTER TABLE db1.test_tbl DROP PERSISTENT INDEX ON TABLETS (100, 101);

Ссылки