> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Движок `Merge` (не путать с `MergeTree`) не хранит данные самостоятельно, но позволяет одновременно читать данные из любого количества других таблиц.

# Движок таблицы Merge

Движок `Merge` (не путать с `MergeTree`) не хранит данные самостоятельно, но позволяет одновременно читать данные из любого количества других таблиц.

Чтение автоматически распараллеливается. Запись в таблицу не поддерживается. При чтении используются индексы таблиц, из которых фактически выполняется чтение, если они существуют.

<div id="creating-a-table">
  ## Создание таблицы
</div>

```sql theme={null}
CREATE TABLE ... Engine=Merge(db_name, tables_regexp)
```

<div id="engine-parameters">
  ## Параметры движка
</div>

<div id="db_name">
  ### `db_name`
</div>

`db_name` — Возможные значения:

* имя базы данных,
  * константное выражение, возвращающее строку с именем базы данных, например, `currentDatabase()`,
  * `REGEXP(expression)`, где `expression` — регулярное выражение для сопоставления имён баз данных.

<div id="tables_regexp">
  ### `tables_regexp`
</div>

`tables_regexp` — регулярное выражение для сопоставления с именами таблиц в указанной DB или нескольких DB.

Регулярные выражения — [re2](https://github.com/google/re2) (поддерживает подмножество PCRE), с учетом регистра.
См. примечания об экранировании символов в регулярных выражениях в разделе "match".

<div id="usage">
  ## Использование
</div>

При выборе таблиц для чтения сама таблица `Merge` не выбирается, даже если она соответствует регулярному выражению. Это сделано во избежание циклов.
Можно создать две таблицы `Merge`, которые будут бесконечно пытаться читать данные друг у друга, но это плохая идея.

Обычно движок `Merge` используют для работы с большим количеством таблиц `TinyLog` как с одной.

<div id="examples">
  ## Примеры
</div>

**Пример 1**

Рассмотрим две базы данных: `ABC_corporate_site` и `ABC_store`. Таблица `all_visitors` будет содержать идентификаторы из таблиц `visitors` в обеих базах данных.

```sql theme={null}
CREATE TABLE all_visitors (id UInt32) ENGINE=Merge(REGEXP('ABC_*'), 'visitors');
```

**Пример 2**

Предположим, у вас есть старая таблица `WatchLog_old`, и вы решили изменить схему партиционирования, не перенося данные в новую таблицу `WatchLog_new`, при этом вам нужно видеть данные из обеих таблиц.

```sql theme={null}
CREATE TABLE WatchLog_old(
    date Date,
    UserId Int64,
    EventType String,
    Cnt UInt64
)
ENGINE=MergeTree
ORDER BY (date, UserId, EventType);

INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3);

CREATE TABLE WatchLog_new(
    date Date,
    UserId Int64,
    EventType String,
    Cnt UInt64
)
ENGINE=MergeTree
PARTITION BY date
ORDER BY (UserId, EventType)
SETTINGS index_granularity=8192;

INSERT INTO WatchLog_new VALUES ('2018-01-02', 2, 'hit', 3);

CREATE TABLE WatchLog AS WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog');

SELECT * FROM WatchLog;
```

```text theme={null}
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-01 │      1 │ hit       │   3 │
└────────────┴────────┴───────────┴─────┘
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-02 │      2 │ hit       │   3 │
└────────────┴────────┴───────────┴─────┘
```

<div id="virtual-columns">
  ## Виртуальные столбцы
</div>

* `_table` — Имя таблицы, из которой были прочитаны данные. Тип: [String](/ru/reference/data-types/string).

  Если фильтрация выполняется по `_table` (например, `WHERE _table='xyz'`), читаются только те таблицы, которые удовлетворяют условию фильтрации.

* `_database` — Содержит имя базы данных, из которой были прочитаны данные. Тип: [String](/ru/reference/data-types/string).

**См. также**

* [Виртуальные столбцы](/ru/reference/engines/table-engines/index#table_engines-virtual_columns)
* табличная функция [merge](/ru/reference/functions/table-functions/merge)
