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

<!-- example Example_1 -->

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

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

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

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

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

```sql
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](../../../Creating_a_table/NLP_and_tokenization/Low-level_tokenization.md#phrase_boundary_step) равным 0 и [stopword_step](../../../Creating_a_table/NLP_and_tokenization/Ignoring_stop-words.md#stopword_step) равным 1.


<!-- intro -->
##### Пример:

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

```sql
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)
```

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

```sql
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-таблице:
```sql
mysql> ATTACH TABLE plain TO TABLE rt;
Query OK, 0 rows affected (0.00 sec)
```

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

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

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

```sql
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 обычная таблица удаляется и больше не доступна для поиска:

```sql
mysql> SELECT * FROM plain WHERE MATCH('test');
ERROR 1064 (42000): no enabled local indexes to search
```
<!-- end -->
<!-- proofread -->

