ALTER TABLE
При помощи команды ALTER TABLE
можно изменить состав колонок и дополнительные параметры таблицы. В одной команде можно указать несколько действий. В общем случае команда ALTER TABLE
выглядит так:
ALTER TABLE <table_name> <action1>, <action2>, ..., <actionN>;
<action>
— это любое действие по изменению таблицы, из описанных ниже.
Изменение состава колонок
YDB поддерживает возможность добавлять столбцы в таблицу, а также удалять неключевые колонки из таблицы.
ADD COLUMN
— добавляет столбец с указанными именем и типом. Приведенный ниже код добавит к таблице episodes
столбец is_deleted
с типом данных Bool
.
ALTER TABLE episodes ADD COLUMN is_deleted Bool;
DROP COLUMN
— удаляет столбец с указанным именем. Приведенный ниже код удалит столбец is_deleted
из таблицы episodes
.
ALTER TABLE episodes DROP column is_deleted;
Вторичные индексы
Добавление индекса
ADD INDEX
— добавляет индекс с указанным именем и типом для заданного набора колонок. Приведенный ниже код добавит глобальный индекс с именем title_index
для колонки title
.
ALTER TABLE `series` ADD INDEX `title_index` GLOBAL ON (`title`);
Могут быть указаны все параметры индекса, описанные в команде CREATE TABLE
Также добавить вторичный индекс можно с помощью команды table index YDB CLI.
Изменение параметров индекса
Индексы имеют параметры, зависящие от типа, которые можно настраивать. Глобальные индексы, синхронные или асинхронные, реализованы в виде скрытых таблиц, и их параметры автоматического партиционирования можно регулировать так же, как и настройки обычных таблиц.
Примечание
В настоящее время задание настроек партиционирования вторичных индексов при создании индекса не поддерживается ни в операторе ALTER TABLE ADD INDEX
, ни в операторе CREATE TABLE INDEX
.
ALTER TABLE <table_name> ALTER INDEX <index_name> SET <partitioning_setting_name> <value>;
ALTER TABLE <table_name> ALTER INDEX <index_name> SET (<partitioning_setting_name_1> = <value_1>, ...);
-
<table_name>
- имя таблицы, индекс которой нужно изменить. -
<index_name>
- имя индекса, который нужно изменить. -
<partitioning_setting_name>
- имя изменяемого параметра, который должен быть одним из следующих:
Примечание
Эти настройки нельзя вернуть к исходным.
<value>
- новое значение параметра. Возможные значения включают:ENABLED
илиDISABLED
для параметровAUTO_PARTITIONING_BY_SIZE
иAUTO_PARTITIONING_BY_LOAD
- для остальных параметров — целое число типа
Uint64
Пример
Код из следующего примера включает автоматическое партиционирование по нагрузке для индекса с именем title_index
в таблице series
и устанавливает ему минимальное количество партиций равным 5:
ALTER TABLE `series` ALTER INDEX `title_index` SET (
AUTO_PARTITIONING_BY_LOAD = ENABLED,
AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 5
);
Удаление индекса
DROP INDEX
— удаляет индекс с указанным именем. Приведенный ниже код удалит индекс с именем title_index
.
ALTER TABLE `series` DROP INDEX `title_index`;
Также удалить вторичный индекс можно с помощью команды table index YDB CLI.
Переименование индекса
RENAME INDEX
— переименовывает индекс с указанным именем.
Если индекс с новым именем существует, будет возвращена ошибка.
Возможность атомарной замены индекса под нагрузкой поддерживается командой ydb table index rename YDB CLI и специализированными методами YDB SDK.
Пример переименования индекса:
ALTER TABLE `series` RENAME INDEX `title_index` TO `title_index_new`;
Добавление или удаление потока изменений
ADD CHANGEFEED <name> WITH (<option> = <value>[, ...])
— добавляет поток изменений (changefeed) с указанным именем и параметрами.
Параметры потока изменений
MODE
— режим работы. Указывает, что именно будет записано в поток при каждом изменении данных в таблице.KEYS_ONLY
— будут записаны только компоненты первичного ключа и признак изменения.UPDATES
— будут записаны значения изменившихся столбцов, получившиеся в результате изменения.NEW_IMAGE
— будут записаны значения всех столбцов, получившиеся в результате изменения.OLD_IMAGE
— будут записаны значения всех столбцов, предшествующие изменению.NEW_AND_OLD_IMAGES
- комбинация режимовNEW_IMAGE
иOLD_IMAGE
. Будут записаны значения всех столбцов до и в результате изменения.
FORMAT
— формат данных, в котором будут записаны данные.JSON
— записывать данные в формате JSON.
VIRTUAL_TIMESTAMPS
— включение-выключение виртуальных меток времени. По умолчанию выключено.RETENTION_PERIOD
— время хранения записей. Тип значения —Interval
, значение по умолчанию — 24 часа (Interval('PT24H')
).TOPIC_MIN_ACTIVE_PARTITIONS
— количество партиций топика. По умолчанию количество партиций топика равно количеству партиций таблицы.INITIAL_SCAN
— включение-выключение первоначального сканирования таблицы. По умолчанию выключено.
Приведенный ниже код добавит поток изменений с именем updates_feed
, в который будут выгружаться значения изменившихся столбцов таблицы в формате JSON:
ALTER TABLE `series` ADD CHANGEFEED `updates_feed` WITH (
FORMAT = 'JSON',
MODE = 'UPDATES'
);
Записи в таком потоке изменений будут храниться в течение 24 часов (значение по умолчанию). Код из следующего примера создаст поток изменений с хранением записей в течение 12 часов:
ALTER TABLE `series` ADD CHANGEFEED `updates_feed` WITH (
FORMAT = 'JSON',
MODE = 'UPDATES',
RETENTION_PERIOD = Interval('PT12H')
);
Пример создания потока изменений с включенными виртуальными метками времени:
ALTER TABLE `series` ADD CHANGEFEED `updates_feed` WITH (
FORMAT = 'JSON',
MODE = 'UPDATES',
VIRTUAL_TIMESTAMPS = TRUE
);
Пример создания потока изменений с первоначальным сканированием:
ALTER TABLE `series` ADD CHANGEFEED `updates_feed` WITH (
FORMAT = 'JSON',
MODE = 'UPDATES',
INITIAL_SCAN = TRUE
);
DROP CHANGEFEED
— удаляет поток изменений с указанным именем. Приведенный ниже код удалит changefeed с именем updates_feed
:
ALTER TABLE `series` DROP CHANGEFEED `updates_feed`;
Переименование таблицы
ALTER TABLE <old_table_name> RENAME TO <new_table_name>;
Если таблица с новым именем существует, будет возвращена ошибка. Возможность транзакционной подмены таблицы под нагрузкой поддерживается специализированными методами в CLI и SDK.
Если в YQL запросе содержится несколько команд ALTER TABLE ... RENAME TO ...
, то каждая будет выполнена в режиме автокоммита в отдельной транзакции. С точки зрения внешнего процесса, таблицы будут переименованы последовательно одна за другой. Чтобы переименовать несколько таблиц в одной транзакции, используйте специализированные методы, доступные в CLI и SDK.
Переименование может использоваться для перемещения таблицы из одной директории внутри БД в другую, например:
ALTER TABLE `table1` RENAME TO `/backup/table1`;
Изменение групп колонок
ADD FAMILY
— создаёт новую группу колонок в таблице. Приведенный ниже код создаст в таблице series_with_families
группу колонок family_small
.
ALTER TABLE series_with_families ADD FAMILY family_small (
DATA = "ssd",
COMPRESSION = "off"
);
При помощи команды ALTER COLUMN
можно изменить группу колонок для указанной колонки. Приведенный ниже код для колонки release_date
в таблице series_with_families
сменит группу колонок на family_small
.
ALTER TABLE series_with_families ALTER COLUMN release_date SET FAMILY family_small;
Две предыдущие команды из листингов 8 и 9 можно объединить в один вызов ALTER TABLE
. Приведенный ниже код создаст в таблице series_with_families
группу колонок family_small
и установит её для колонки release_date
.
ALTER TABLE series_with_families
ADD FAMILY family_small (
DATA = "ssd",
COMPRESSION = "off"
),
ALTER COLUMN release_date SET FAMILY family_small;
При помощи команды ALTER FAMILY
можно изменить параметры группы колонок. Приведенный ниже код для группы колонок default
в таблице series_with_families
сменит тип хранилища на hdd
:
ALTER TABLE series_with_families ALTER FAMILY default SET DATA "hdd";
Примечание
Доступные типы устройств хранения зависят от конфигурации кластера YDB.
Могут быть указаны все параметры группы колонок, описанные в команде CREATE TABLE
Изменение дополнительных параметров таблицы
Большинство параметров таблицы в YDB, приведенных на странице описания таблицы, можно изменить командой ALTER
.
В общем случае команда для изменения любого параметра таблицы выглядит следующим образом:
ALTER TABLE <table_name> SET (<key> = <value>);
<key>
— имя параметра, <value>
— его новое значение.
Например, такая команда выключит автоматическое партиционирование таблицы:
ALTER TABLE series SET (AUTO_PARTITIONING_BY_SIZE = DISABLED);
Сброс дополнительных параметров таблицы
Некоторые параметры таблицы в YDB, приведенные на странице описания таблицы, можно сбросить командой ALTER
.
Команда для сброса параметра таблицы выглядит следующим образом:
ALTER TABLE <table_name> RESET (<key>);
<key>
— имя параметра.
Например, такая команда сбросит (удалит) настройки TTL для таблицы:
ALTER TABLE series RESET (TTL);