今天把数据库从5.0的一个mysql版本迁移到mysql 5.1的过程中遇到一个问题,发现一个MERGE表一直出现Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist报错,但是在5.0上一直是OK的,于是进行了一些实践后发现是由于MERGE的表索引和其他子表不一致导致。
添加索引之后正常了。而为什么5.0是正常的呢,我猜测是由于5.0的版本对MERGE表没有那么严格的要求。
因此当遇到Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist报错的时候需要从如下几个方面入手:
1、查看是不是有一些表不是MYISAM引擎的表,因为MERGE引擎只适用于MYISAM表
2、查看是不是在union的表中含有不存在的表。
3、查看是不是MERGE的时候引用了不在同一个库的表,并且该表没有指定数据库名字。
4、比较各个表的结构(索引、引擎、列、字符集等)是否一致。
子表代码为:
CREATETABLE`test0` (
02.`uin` int(10) unsigned NOTNULL,
03.`data` text NOTNULL,
04.`modtime` int(10) unsigned NOTNULL,
05.PRIMARYKEY(`uin`)
06.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
07.
08.CREATETABLE`test1` (
09.`uin` int(10) unsigned NOTNULL,
10.`data` text NOTNULL,
11.`modtime` int(10) unsigned NOTNULL,
12.PRIMARYKEY(`uin`)
13.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
14.
15.CREATETABLE`test2` (
16.`uin` int(10) unsigned NOTNULL,
17.`data` text NOTNULL,
18.`modtime` int(10) unsigned NOTNULL,
19.PRIMARYKEY(`uin`)
20.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
21.
22.CREATETABLE`test3` (
23.`uin` int(10) unsigned NOTNULL,
24.`data` text NOTNULL,
25.`modtime` int(10) unsigned NOTNULL,
26.PRIMARYKEY(`uin`)
27.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
28.
29.CREATETABLE`test4` (
30.`uin` int(10) unsigned NOTNULL,
31.`data` text NOTNULL,
32.`modtime` int(10) unsigned NOTNULL,
33.PRIMARYKEY(`uin`)
34.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
35.
36.CREATETABLE`test5` (
37.`uin` int(10) unsigned NOTNULL,
38.`data` text NOTNULL,
39.`modtime` int(10) unsigned NOTNULL,
40.PRIMARYKEY(`uin`)
41.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
42.
43.CREATETABLE`test6` (
44.`uin` int(10) unsigned NOTNULL,
45.`data` text NOTNULL,
46.`modtime` int(10) unsigned NOTNULL,
47.PRIMARYKEY(`uin`)
48.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
49.
50.CREATETABLE`test7` (
51.`uin` int(10) unsigned NOTNULL,
52.`data` text NOTNULL,
53.`modtime` int(10) unsigned NOTNULL,
54.PRIMARYKEY(`uin`)
55.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
56.
57.CREATETABLE`test8` (
58.`uin` int(10) unsigned NOTNULL,
59.`data` text NOTNULL,
60.`modtime` int(10) unsigned NOTNULL,
61.PRIMARYKEY(`uin`)
62.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
63.
64.CREATETABLE`test9` (
65.`uin` int(10) unsigned NOTNULL,
66.`data` text NOTNULL,
67.`modtime` int(10) unsigned NOTNULL,
68.PRIMARYKEY(`uin`)
69.) ENGINE=MyISAM DEFAULTCHARSET=latin1;
1.CREATETABLE`test` (
2.`uin` int(10) unsigned NOTNULL,
3.`data` text NOTNULL,
4.`modtime` int(10) unsigned NOTNULL,
5.PRIMARYKEY(`uin`),
6.KEY`modtime` (`modtime`)
7.) ENGINE=MRG_MyISAM DEFAULTCHARSET=latin1 UNION=(`test0`,`test1`,`test2`,`test3`,`test4`,`test5`,`test6`,`test7`,`test8`,`test9`);
--转自