> ## 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.

> Le moteur `Merge` (à ne pas confondre avec `MergeTree`) ne stocke pas lui-même les données, mais permet de lire simultanément dans un nombre quelconque d'autres tables.

# Moteur de table Merge

Le moteur `Merge` (à ne pas confondre avec `MergeTree`) ne stocke pas lui-même les données, mais permet de lire simultanément dans un nombre quelconque d'autres tables.

La lecture est automatiquement parallélisée. L'écriture dans une telle table n'est pas prise en charge. Lors de la lecture, les index des tables effectivement lues sont utilisés, s'ils existent.

<div id="creating-a-table">
  ## Créer une table
</div>

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

<div id="engine-parameters">
  ## Paramètres du moteur
</div>

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

`db_name` — Valeurs possibles :

* nom de base de données,
  * expression constante qui renvoie une chaîne contenant un nom de base de données, par exemple `currentDatabase()`,
  * `REGEXP(expression)`, où `expression` est une expression régulière permettant de faire correspondre les noms de DB.

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

`tables_regexp` — Une expression régulière permettant de faire correspondre les noms de table dans la ou les DB spécifiées.

Expressions régulières — [re2](https://github.com/google/re2) (prend en charge un sous-ensemble de PCRE), sensible à la casse.
Voir les notes sur l’échappement des symboles dans les expressions régulières dans la section « match ».

<div id="usage">
  ## Utilisation
</div>

Lors de la sélection des tables à lire, la table `Merge` elle-même n'est pas sélectionnée, même si elle correspond à la regex. Cela permet d'éviter les boucles.
Il est possible de créer deux tables `Merge` qui essaieront indéfiniment de lire les données l'une de l'autre, mais ce n'est pas une bonne idée.

La manière habituelle d'utiliser le moteur `Merge` consiste à manipuler un grand nombre de tables `TinyLog` comme s'il s'agissait d'une seule table.

<div id="examples">
  ## Exemples
</div>

**Exemple 1**

Considérez deux bases de données, `ABC_corporate_site` et `ABC_store`. La table `all_visitors` contiendra les ID des tables `visitors` de ces deux bases de données.

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

**Exemple 2**

Supposons que vous ayez une ancienne table `WatchLog_old` et que vous ayez décidé de modifier le partitionnement sans déplacer les données vers une nouvelle table `WatchLog_new`, et que vous deviez consulter les données des deux tables.

```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">
  ## Colonnes virtuelles
</div>

* `_table` — Nom de la table à partir de laquelle les données ont été lues. Type : [String](/fr/reference/data-types/string).

  Si vous filtrez sur `_table` (par exemple `WHERE _table='xyz'`), seules les tables qui satisfont la condition de filtrage sont lues.

* `_database` — Contient le nom de la base de données à partir de laquelle les données ont été lues. Type : [String](/fr/reference/data-types/string).

**Voir aussi**

* [Colonnes virtuelles](/fr/reference/engines/table-engines/index#table_engines-virtual_columns)
* Fonction de table [merge](/fr/reference/functions/table-functions/merge)
