以下是 MERGE 表的已知问题:
-
在 MySQL Server 5.1.23 之前的版本中,可以创建临时 MERGE 表,其中包含非临时的 MyISAM 子表。
从 5.1.23 版本开始,MERGE 子表通过父表锁定。如果父表是临时的,那么它不会被锁定,子表也不会被锁定。并行使用 MyISAM 表会导致表损坏。
-
如果您使用
ALTER TABLE
将 MERGE 表更改为其他存储引擎,映射到基础表的关系将丢失。相反,基础 MyISAM 表的行将被复制到更改后的表中,该表将使用指定的存储引擎。 -
MERGE 表的
INSERT_METHOD
表选项指示哪个基础 MyISAM 表用于插入 MERGE 表。然而,对于该 MyISAM 表的AUTO_INCREMENT
表选项只有在至少有一行直接插入到该 MyISAM 表后才生效。 -
MERGE 表无法维护整个表的唯一性约束。当您执行
INSERT
时,数据将进入第一个或最后一个 MyISAM 表(由INSERT_METHOD
选项确定)。MySQL 确保唯一键值在该 MyISAM 表中保持唯一,但不是在整个集合中的所有基础表中。 -
因为 MERGE 引擎无法在整个集合中的基础表上强制唯一性,因此
REPLACE
不会按预期工作。两个关键事实是:类似的考虑也适用于
INSERT ... ON DUPLICATE KEY UPDATE
。 -
MERGE 表不支持分区。这意味着您不能对 MERGE 表进行分区,也不能对 MERGE 表的基础 MyISAM 表进行分区。
-
您不应该在打开的 MERGE 表上使用
ANALYZE TABLE
、REPAIR TABLE
、OPTIMIZE TABLE
、ALTER TABLE
、DROP TABLE
、DELETE
without aWHERE
子句或TRUNCATE TABLE
。如果您这样做,MERGE 表可能仍然引用原始表并产生意外结果。要解决这个问题,请确保在执行上述操作之前没有打开的 MERGE 表,方法是发出FLUSH TABLES
语句。意外结果包括 MERGE 表报告表损坏的可能性。如果在对基础 MyISAM 表执行上述操作后出现这种情况,那么损坏信息是虚假的。要处理这种情况,请在修改基础 MyISAM 表后发出
FLUSH TABLES
语句。 -
DROP TABLE
在 Windows 上不能在使用MERGE
表的表上工作,因为MERGE
存储引擎的表映射对 MySQL 的上层是隐藏的。Windows 不允许删除打开的文件,因此您必须先刷新所有MERGE
表(使用FLUSH TABLES
)或删除MERGE
表,然后才能删除表。 -
当访问表时(例如,在
SELECT
或INSERT
语句中),将检查MyISAM
表和MERGE
表的定义。这些检查确保表和父MERGE
表定义匹配,通过比较列顺序、类型、大小和关联索引。如果表之间存在差异,将返回错误并失败。 -
在
MERGE
表和其基础表中的索引顺序应该相同。如果您使用ALTER TABLE
添加唯一索引到MERGE
表使用的表中,然后使用ALTER TABLE
添加非唯一索引到MERGE
表上,索引顺序将不同于基础表中的索引顺序。(这发生是因为ALTER TABLE
将唯一索引放在非唯一索引之前,以便快速检测重复键。)因此,对具有这种索引的表的查询可能会返回意外的结果。 -
如果您遇到类似于 ERROR 1017 (HY000): Can't find file: '
tbl_name
.MRG' (errno: 2) 的错误信息,通常表明基础表之一不使用MyISAM
存储引擎。请确认所有这些表都是MyISAM
。 -
在
MERGE
表中的最大行数为 264 (~1.844E+19;与MyISAM
表相同)。无法将多个MyISAM
表合并到一个MERGE
表中,该表将具有超过这个数字的行数。 -
使用不同行格式的基础
MyISAM
表与父MERGE
表当前已知失败。请参阅 Bug #32364。 -
您不能在
LOCK TABLES
生效时更改非临时MERGE
表的联合列表。以下操作 不 工作:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...; LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE; ALTER TABLE m1 ... UNION=(t1,t2) ...;
然而,您可以使用临时
MERGE
表来实现。 -
您不能使用
CREATE ... SELECT
创建MERGE
表,无论是临时MERGE
表还是非临时MERGE
表。例如:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;
尝试这样做将导致错误:
tbl_name
不是BASE TABLE
。 -
在某些情况下,
MERGE
表和基础表之间的PACK_KEYS
表选项值的差异可能会导致意外的结果,如果基础表包含CHAR
或BINARY
列。作为解决方法,请使用ALTER TABLE
确保所有参与表具有相同的PACK_KEYS
值。(Bug #50646)