以下是 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、DELETEwithout 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)