合并
示例:
数据会从 hits
数据库中表名匹配正则 ‘^WatchLog
’ 的表中读取。
除了数据库名,你也可以用一个返回字符串的常量表达式。例如, currentDatabase()
。
当选择需要读的表时,Merge
表本身会被排除,即使它匹配上了该正则。这样设计为了避免循环。
当然,是能够创建两个相互无限递归读取对方数据的 Merge
表的,但这并没有什么意义。
Merge
引擎的一个典型应用是可以像使用一张表一样使用大量的 TinyLog
表。
示例 2 :
CREATE TABLE WatchLog_old(date Date, UserId Int64, EventType String, Cnt UInt64)
ENGINE=MergeTree(date, (UserId, EventType), 8192);
INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3);
CREATE TABLE WatchLog_new(date Date, UserId Int64, EventType String, Cnt UInt64)
CREATE TABLE WatchLog as WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog');
SELECT *
FROM WatchLog
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
└────────────┴────────┴───────────┴─────┘
┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐
│ 2018-01-02 │ 2 │ hit │ 3 │
└────────────┴────────┴───────────┴─────┘
虚拟列是一种由表引擎提供而不是在表定义中的列。换种说法就是,这些列并没有在 CREATE TABLE
中指定,但可以在 中使用。
下面列出虚拟列跟普通列的不同点:
- 虚拟列不在表结构定义里指定。
- 不能用
INSERT
向虚拟列写数据。 - 使用不指定列名的
INSERT
语句时,虚拟列要会被忽略掉。 - 虚拟列不会出现在
SHOW CREATE TABLE
和DESC TABLE
的查询结果里。
Merge
类型的表包括一个 String
类型的 _table
虚拟列。(如果该表本来已有了一个 _table
的列,那这个虚拟列会命名为 _table1
;如果 _table1
也本就存在了,那这个虚拟列会被命名为 _table2
,依此类推)该列包含被读数据的表名。