Обновление схемы таблицы

Обновление схемы таблицы в режиме RT

ALTER TABLE table ADD COLUMN column_name [{INTEGER|INT|BIGINT|FLOAT|BOOL|MULTI|MULTI64|JSON|STRING|TIMESTAMP|TEXT [INDEXED [ATTRIBUTE]]}] [engine='columnar']
ALTER TABLE table DROP COLUMN column_name
ALTER TABLE table MODIFY COLUMN column_name bigint

Эта функция поддерживает только добавление одного поля за раз для RT таблиц или расширение столбца int до bigint. Поддерживаемые типы данных:

  • int - целочисленный атрибут
  • timestamp - атрибут временной метки
  • bigint - атрибут большого целого числа
  • float - атрибут с плавающей точкой
  • bool - булев атрибут
  • multi - мультизначный целочисленный атрибут
  • multi64 - мультизначный атрибут большого целого числа
  • json - json атрибут
  • string / text attribute / string attribute - строковый атрибут
  • text / text indexed stored / string indexed stored - полнотекстовое индексированное поле с оригинальным значением, сохранённым в docstore
  • text indexed / string indexed - полнотекстовое индексированное поле, только индексируется (оригинальное значение не сохраняется в docstore)
  • text indexed attribute / string indexed attribute - полнотекстовое индексированное поле + строковый атрибут (оригинальное значение не сохраняется в docstore)
  • text stored / string stored - значение будет только сохранено в docstore, не полнотекстово индексировано, не строковый атрибут
  • добавление engine='columnar' к любому атрибуту (кроме json) сделает его сохранённым в колоночном хранилище

Важные замечания:

  • ❗Рекомендуется создавать резервную копию файлов таблицы перед выполнением ALTER, чтобы избежать повреждения данных в случае внезапного отключения питания или других подобных проблем.
  • Запросы к таблице невозможны во время добавления столбца.
  • Значения нового атрибута устанавливаются в 0.
  • ALTER не работает для распределённых таблиц и таблиц без атрибутов.
  • Нельзя удалять столбец id.
  • При удалении поля, которое является и полнотекстовым полем, и строковым атрибутом, первый ALTER DROP удаляет атрибут, второй — полнотекстовое поле.
  • Добавление/удаление полнотекстового поля поддерживается только в RT режиме.
‹›
  • Example
Example
📋
mysql> desc rt;
+------------+-----------+
| Field      | Type      |
+------------+-----------+
| id         | bigint    |
| text       | field     |
| group_id   | uint      |
| date_added | timestamp |
+------------+-----------+
mysql> alter table rt add column test integer;
mysql> desc rt;
+------------+-----------+
| Field      | Type      |
+------------+-----------+
| id         | bigint    |
| text       | field     |
| group_id   | uint      |
| date_added | timestamp |
| test       | uint      |
+------------+-----------+
mysql> alter table rt drop column group_id;
mysql> desc rt;
+------------+-----------+
| Field      | Type      |
+------------+-----------+
| id         | bigint    |
| text       | field     |
| date_added | timestamp |
| test       | uint      |
+------------+-----------+
mysql> alter table rt add column title text indexed;
mysql> desc rt;
+------------+-----------+------------+
| Field      | Type      | Properties |
+------------+-----------+------------+
| id         | bigint    |            |
| text       | text      | indexed    |
| title      | text      | indexed    |
| date_added | timestamp |            |
| test       | uint      |            |
+------------+-----------+------------+
mysql> alter table rt add column title text attribute;
mysql> desc rt;
+------------+-----------+------------+
| Field      | Type      | Properties |
+------------+-----------+------------+
| id         | bigint    |            |
| text       | text      | indexed    |
| title      | text      | indexed    |
| date_added | timestamp |            |
| test       | uint      |            |
| title      | string    |            |
+------------+-----------+------------+
mysql> alter table rt drop column title;
mysql> desc rt;
+------------+-----------+------------+
| Field      | Type      | Properties |
+------------+-----------+------------+
| id         | bigint    |            |
| text       | text      | indexed    |
| title      | text      | indexed    |
| date_added | timestamp |            |
| test       | uint      |            |
+------------+-----------+------------+
mysql> alter table rt drop column title;
mysql> desc rt;
+------------+-----------+------------+
| Field      | Type      | Properties |
+------------+-----------+------------+
| id         | bigint    |            |
| text       | text      | indexed    |
| date_added | timestamp |            |
| test       | uint      |            |
+------------+-----------+------------+

Обновление настроек полнотекстового поиска в режиме RT

ALTER TABLE table ft_setting='value'[, ft_setting2='value']

Вы можете использовать ALTER для изменения настроек полнотекстового поиска вашей таблицы в RT режиме. Однако это влияет только на новые документы, а не на существующие. Пример:

  • создаём таблицу с полнотекстовым полем и charset_table, которая разрешает только 3 символа для поиска: a, b и c.
  • затем вставляем документ 'abcd' и ищем его запросом abcd, символ d игнорируется, так как его нет в массиве charset_table
  • затем понимаем, что хотим, чтобы d тоже искался, и добавляем его с помощью ALTER
  • но тот же запрос where match('abcd') всё ещё ищет по abc, потому что существующий документ помнит прежнее содержимое charset_table
  • затем добавляем другой документ abcd и снова ищем по abcd
  • теперь находятся оба документа, и show meta показывает, что использовались два ключевых слова: abc (для старого документа) и abcd (для нового).
‹›
  • Example
Example
📋
mysql> create table rt(title text) charset_table='a,b,c';
mysql> insert into rt(title) values('abcd');
mysql> select * from rt where match('abcd');
+---------------------+-------+
| id                  | title |
+---------------------+-------+
| 1514630637682688054 | abcd  |
+---------------------+-------+
mysql> show meta;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total         | 1     |
| total_found   | 1     |
| time          | 0.000 |
| keyword[0]    | abc   |
| docs[0]       | 1     |
| hits[0]       | 1     |
+---------------+-------+
mysql> alter table rt charset_table='a,b,c,d';
mysql> select * from rt where match('abcd');
+---------------------+-------+
| id                  | title |
+---------------------+-------+
| 1514630637682688054 | abcd  |
+---------------------+-------+
mysql> show meta
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total         | 1     |
| total_found   | 1     |
| time          | 0.000 |
| keyword[0]    | abc   |
| docs[0]       | 1     |
| hits[0]       | 1     |
+---------------+-------+
mysql> insert into rt(title) values('abcd');
mysql> select * from rt where match('abcd');
+---------------------+-------+
| id                  | title |
+---------------------+-------+
| 1514630637682688055 | abcd  |
| 1514630637682688054 | abcd  |
+---------------------+-------+
mysql> show meta;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total         | 2     |
| total_found   | 2     |
| time          | 0.000 |
| keyword[0]    | abc   |
| docs[0]       | 1     |
| hits[0]       | 1     |
| keyword[1]    | abcd  |
| docs[1]       | 1     |
| hits[1]       | 1     |
+---------------+-------+

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

Вы можете изменить имя таблицы в режиме RT.

ALTER TABLE table_name RENAME new_table_name;

ПРИМЕЧАНИЕ: Переименование таблицы в режиме реального времени требует Manticore Buddy. Если не работает, убедитесь, что Buddy установлен.

‹›
  • Example
Example
📋
ALTER TABLE table_name RENAME new_table_name;
‹›
Response
Query OK, 0 rows affected (0.00 sec)

Обновление настроек полнотекстового поиска в plain режиме

ALTER TABLE table RECONFIGURE

ALTER также может перенастроить RT таблицу в plain режиме, чтобы новые настройки токенизации, морфологии и другой обработки текста из конфигурационного файла применялись к новым документам. Обратите внимание, что существующие документы останутся без изменений. Внутренне это принудительно сохраняет текущий RAM-чанк как новый диск-чанк и корректирует заголовок таблицы, чтобы новые документы токенизировались с использованием обновлённых настроек полнотекстового поиска.

‹›
  • Example
Example
📋
mysql> show table rt settings;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| settings      |       |
+---------------+-------+
1 row in set (0.00 sec)
mysql> alter table rt reconfigure;
Query OK, 0 rows affected (0.00 sec)
mysql> show table rt settings;
+---------------+----------------------+
| Variable_name | Value                |
+---------------+----------------------+
| settings      | morphology = stem_en |
+---------------+----------------------+
1 row in set (0.00 sec)

Перестроение вторичного индекса

ALTER TABLE table REBUILD SECONDARY

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

  • При обновлении атрибута его вторичный индекс отключается.
  • Если Manticore загружает таблицу со старой версией вторичных индексов, которая больше не поддерживается, вторичные индексы будут отключены для всей таблицы.

ALTER TABLE table REBUILD SECONDARY перестраивает вторичные индексы из данных атрибутов и снова их включает.

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

‹›
  • Example
Example
📋
ALTER TABLE rt REBUILD SECONDARY;
‹›
Response
Query OK, 0 rows affected (0.00 sec)

Перестроение KNN индекса

ALTER TABLE table REBUILD KNN

Команда повторно обрабатывает все векторные данные в таблице и перестраивает KNN индекс с нуля.

‹›
  • Example
Example
📋
ALTER TABLE rt REBUILD KNN;
‹›
Response
Query OK, 0 rows affected (0.00 sec)

Обновление API ключа атрибута (для генерации эмбеддингов) в режиме RT

ALTER можно использовать для изменения API ключа при использовании удалённой модели для автоэмбеддингов:

ALTER TABLE table_name MODIFY COLUMN column_name API_KEY='key';
‹›
  • Example
Example
📋
ALTER TABLE rt MODIFY COLUMN vector API_KEY='key';

Изменение распределённой таблицы

Чтобы изменить список локальных или удалённых узлов в распределённой таблице, используйте тот же синтаксис, что и при создании таблицы. Просто замените CREATE на ALTER в команде и удалите type='distributed':

ALTER TABLE `distr_table_name` [[local='local_table_name'], [agent='host:port:remote_table'] ... ]

ПРИМЕЧАНИЕ: Изменение схемы распределённой таблицы онлайн требует Manticore Buddy. Если не работает, убедитесь, что Buddy установлен.

‹›
  • Example
Example
📋
ALTER TABLE local_dist local='index1' local='index2' agent='127.0.0.1:9312:remote_table';
Last modified: August 28, 2025