Присоединение одной таблицы к другой

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

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

Во втором случае обычно требуется добавить большой объём новых данных в RT-таблицу, и снова создание обычной таблицы с этими данными проще, чем заполнение существующей RT-таблицы.

Вы также можете присоединить существующую RT-таблицу к другой.

Присоединение таблицы - общий синтаксис

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

ATTACH TABLE plain_or_rt_table TO TABLE rt_table [WITH TRUNCATE]

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

Обратите внимание, что когда таблица присоединяется к пустой RT-таблице, поля, атрибуты и настройки обработки текста (токенизатор, словоформы и т.д.) из исходной таблицы копируются и вступают в силу. Соответствующие части определения RT-таблицы из файла конфигурации будут проигнорированы.

При использовании опции TRUNCATE RT-таблица очищается перед присоединением исходной обычной таблицы. Это позволяет сделать операцию атомарной или гарантирует, что присоединяемая исходная обычная таблица будет единственными данными в целевой RT-таблице.

ATTACH TABLE имеет ряд ограничений. Наиболее важно, что в настоящее время требуется, чтобы целевая RT-таблица была либо пустой, либо имела те же настройки, что и исходная таблица. В случае, если исходная таблица присоединяется к непустой RT-таблице, данные RT-таблицы, собранные на данный момент, сохраняются как обычный дисковый чанк, а присоединяемая таблица становится новейшим дисковым чанком, при этом документы с одинаковыми ID помечаются как удалённые. Полный список ограничений следующий:

  • Целевая RT-таблица должна быть либо пустой, либо иметь те же настройки, что и исходная таблица.
  • В исходной таблице необходимо установить phrase_boundary_step равным 0 и stopword_step равным 1.
‹›
  • Example
Example
📋

Перед ATTACH RT-таблица пуста и имеет 3 поля:

mysql> DESC rt;
Empty set (0.00 sec)
mysql> SELECT * FROM rt;
+-----------+---------+
| Field     | Type    |
+-----------+---------+
| id        | integer |
| testfield | field   |
| testattr  | uint    |
+-----------+---------+
3 rows in set (0.00 sec)

Обычная таблица не пуста:

mysql> SELECT * FROM plain WHERE MATCH('test');
+------+--------+----------+------------+
| id   | weight | group_id | date_added |
+------+--------+----------+------------+
|    1 |   1304 |        1 | 1313643256 |
|    2 |   1304 |        1 | 1313643256 |
|    3 |   1304 |        1 | 1313643256 |
|    4 |   1304 |        1 | 1313643256 |
+------+--------+----------+------------+
4 rows in set (0.00 sec)

Присоединение обычной таблицы к RT-таблице:

mysql> ATTACH TABLE plain TO TABLE rt;
Query OK, 0 rows affected (0.00 sec)

Теперь RT-таблица имеет 5 полей:

mysql> DESC rt;
+------------+-----------+
| Field      | Type      |
+------------+-----------+
| id         | integer   |
| title      | field     |
| content    | field     |
| group_id   | uint      |
| date_added | timestamp |
+------------+-----------+
5 rows in set (0.00 sec)

И она не пуста:

mysql> SELECT * FROM rt WHERE MATCH('test');
+------+--------+----------+------------+
| id   | weight | group_id | date_added |
+------+--------+----------+------------+
|    1 |   1304 |        1 | 1313643256 |
|    2 |   1304 |        1 | 1313643256 |
|    3 |   1304 |        1 | 1313643256 |
|    4 |   1304 |        1 | 1313643256 |
+------+--------+----------+------------+
4 rows in set (0.00 sec)

После ATTACH обычная таблица удаляется и больше не доступна для поиска:

mysql> SELECT * FROM plain WHERE MATCH('test');
ERROR 1064 (42000): no enabled local indexes to search
Last modified: August 28, 2025