合并

    示例:

    数据会从 hits 数据库中表名匹配正则 ‘^WatchLog’ 的表中读取。

    除了数据库名,你也可以用一个返回字符串的常量表达式。例如, currentDatabase()

    当选择需要读的表时,Merge 表本身会被排除,即使它匹配上了该正则。这样设计为了避免循环。
    当然,是能够创建两个相互无限递归读取对方数据的 Merge 表的,但这并没有什么意义。

    Merge 引擎的一个典型应用是可以像使用一张表一样使用大量的 TinyLog 表。

    示例 2 :

    1. CREATE TABLE WatchLog_old(date Date, UserId Int64, EventType String, Cnt UInt64)
    2. ENGINE=MergeTree(date, (UserId, EventType), 8192);
    3. INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3);
    4. CREATE TABLE WatchLog_new(date Date, UserId Int64, EventType String, Cnt UInt64)
    5. CREATE TABLE WatchLog as WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog');
    6. SELECT *
    7. FROM WatchLog
    8. ┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
    9. └────────────┴────────┴───────────┴─────┘
    10. ┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
    11. 2018-01-02 2 hit 3
    12. └────────────┴────────┴───────────┴─────┘

    虚拟列是一种由表引擎提供而不是在表定义中的列。换种说法就是,这些列并没有在 CREATE TABLE 中指定,但可以在 中使用。

    下面列出虚拟列跟普通列的不同点:

    • 虚拟列不在表结构定义里指定。
    • 不能用 INSERT 向虚拟列写数据。
    • 使用不指定列名的 INSERT 语句时,虚拟列要会被忽略掉。
    • 虚拟列不会出现在 SHOW CREATE TABLEDESC TABLE 的查询结果里。

    Merge 类型的表包括一个 String 类型的 _table 虚拟列。(如果该表本来已有了一个 _table 的列,那这个虚拟列会命名为 _table1 ;如果 _table1 也本就存在了,那这个虚拟列会被命名为 _table2 ,依此类推)该列包含被读数据的表名。

    来源文章