Merge引擎与MergeTree引擎一点儿关系没有,它类似于union all的功能,将不同引擎表中的数据union到一起.
准备数据:
CREATE TABLE mydatabase.mergeTest1
(`id` Int8, `name` String)
ENGINE = MergeTree
ORDER BY id;
insert into mergeTest1 values(1,'zhangsan');
create table mydatabase.mergeTest2(id Int16,name String)
engine=Log;
insert into mergeTest2 values(2,'lisis');
如上,id列的类型略微不一样,表引擎完全不一样.
创建Merge引擎表
CREATE TABLE mydatabase.merge
(
`id` Int8,
`name` String
)
ENGINE = Merge('mydatabase', 'mergeTest*')
Merge(args1,args2)
args1:指明库名
args2:指明表明,支持正则表示,上面是以mergeTest开头的所有表.
执行查询:
select * from merge;
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
┌─id─┬─name──┐
│ 2 │ lisis │
└────┴───────┘
注意,如果mergeTest1与mergeTest2的字段名不一样将会报错,但是字段名一样而类型不一样,并且类型可以自动转化的情况下,不会报错.
另外,Merge引擎有一列隐藏字段 _table,记录的是数据来源的表:
select *,_table from merge;
┌─id─┬─name─────┬─_table─────┐
│ 1 │ zhangsan │ mergeTest1 │
└────┴──────────┴────────────┘
┌─id─┬─name──┬─_table─────┐
│ 2 │ lisis │ mergeTest2 │
└────┴───────┴────────────┘
所以merge引擎可以根据_table来过滤,如:
select * from merge where _table ='mergeTest1';
另外还有一种表函数merge(‘db’,‘tb’);
select * from merge('mydatabase','mergeTest*');
┌─id─┬─name─────┐
│ 1 │ zhangsan │
└────┴──────────┘
┌─id─┬─name──┐
│ 2 │ lisis │
└────┴───────┘