mysql 的MyISAM存储引擎使用虚表跟表组对指定的表组进行联合查询的操作
实现步骤
1.创建多个子表 用于存储数据
CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; CREATE TABLE `t3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
2.多表联合
CREATE TABLE `mergetable` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`t1`,`t2`,`t2`);
注意 INSERT_METHOD=LAST UNION=(`t1`,`t2`,`t3`) 这是关键
INSERT_METHOD只有LAST 和FIRST 也就是表的插入方向是限定的
操作 :
从mergetable插入操作
INSERT into mergetable(`name`)VALUES(30)
经过查看 发现数据插入到了t3和mergetable
使用explain查看
EXPLAIN INSERT into mergetable(`name`)VALUES(30) 结果 1 INSERT mergetable ALL
可以发现 插入是在数据库层面做的 不是在sql这一层
接下来 我们换个方式 从子表插入 看看mergetable的数据变化
INSERT into t1(`name`)VALUES(1000)
发现t1和mergetable都多了一条数据
也就是 子表跟mergetable是双向数据绑定的子父子集合关系
子表的id在mergetable不具有唯一性 需要通过使用其其他手段进行唯一性控制