ALTER TABLE
ALTER TABLE изменяет существующую таблицу, включая:
- Переименование таблицы, раздела, rollup или столбца
- Изменение комментария к таблице
- Изменение разделов (добавление/удаление разделов и изменение атрибутов разделов)
- Изменение метода bucketing и количества buckets
- Изменение столбцов (добавление/удаление столбцов, изменение порядка столбцов и изменение комментария к столбцу)
- Создание/удаление rollup
- Создание/удаление индекса
- Изменение свойств таблицы
- Атомарный обмен
- Ручное сжатие версий данных
- Удаление Primary Key Persistent Index
Эта операция требует привилегию 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 раздел.
- Для range разделов вы можете добавить один range раздел (
-
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", ...)]
Примечание:
- Если вы добавляете столбец значения в таблицу Aggregate, вам нужно указать agg_type.
- Если вы добавляете ключевой столбец в таблицу, отличную от Aggregate (например, таблицу Duplicate Key), вам нужно указать ключевое слово KEY.
- Вы не можете добавить столбец, который уже существует в базовом индексе, в rollup. (Вы можете пересоздать rollup при необходимости.)