[Err] 1168 - Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
Mysql运用MERGE引擎进行分表
这里所做的分表是指水平拆分,就是多张表数据结构完全一致(所有的数据列一致,不多不少)。
要想用 MERGE引擎,所有需要拆分的表及拆分后的字表,必须为 MYISAM 引擎,这个好难满足。因为 MYISAM 引擎不支持事务,这在生产实际中极少数据表会采用 MYISAM。因为现在的应用,都想用分布式事务(极麻烦),不用事务那就别提了,办不到。
将user拆分成二张表user1和user2,
// (备份users表)备份!备份!备份!重要的事情说三遍。 DROP TABLE IF EXISTS users; CREAT users LIKE user1; // 将users表的所有附加属性都拷贝过来 ALTER TABLE users ENGINE=MRG_MYISAM UNION=(user1,user2) INSERT_METHOD=LAST;
【特注】:在创建完成后,所有对users的操作都可能报一个错:[Err] 1168 - Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
究其原因,就是拷贝的时候遗漏了。我是遗漏了 CHARSET=utf8 其他小伙伴呢?!!!
还有可能是(网络上的):
1、查看是不是有一些表不是MYISAM引擎的表,因为MERGE引擎只适用于MYISAM表
2、查看是不是在union的表中含有不存在的表。
3、查看是不是MERGE的时候引用了不在同一个库的表,并且该表没有指定数据库名字。
4、比较各个表的结构(索引、引擎、列、字符集等)是否一致。
5、CHARSET=utf8 等,类似的约定是否一致(全拷贝过来!!!)。
参考资料: