以下是MERGE
表的已知问题:
在 5.1.23 之前的 MySQL 服务器版本中,可以使用非临时子 MyISAM 表创建临时合并表。
从 5.1.23 版本开始,MERGE children 通过父表被锁定。如果父母是临时的,它没有被锁定,因此孩子们也没有被锁定。并行使用 MyISAM 表会损坏它们。
如果您使用
ALTER TABLE
将MERGE
表更改为另一个存储引擎,则到基础表的映射将丢失。相反,底层MyISAM
表中的行被复制到更改后的表中,然后该表使用指定的存储引擎。表的
INSERT_METHOD
表选项MERGE
指示要使用哪个基础MyISAM
表来插入到MERGE
表中。但是, 在至少有一行直接插入到表中之前,对该表使用AUTO_INCREMENT
table 选项对MyISAM
插入到表中没有影响 。MERGE
MyISAM
一个
MERGE
表不能维护整个表的唯一性约束。当您执行 时INSERT
,数据进入第一个或最后一个MyISAM
表(由INSERT_METHOD
选项确定)。MySQL 确保唯一键值在该MyISAM
表中保持唯一,但不会在集合中的所有基础表中保持唯一。由于
MERGE
引擎无法对基础表集强制执行唯一性,因此REPLACE
无法按预期工作。两个关键事实是:类似的考虑适用于
INSERT ... ON DUPLICATE KEY UPDATE
。MERGE
表不支持分区。也就是说,您不能对表进行分区MERGE
,也不能对MERGE
表的任何基础MyISAM
表进行分区。您不应该在没有子句的情况下使用, , , , , 或
ANALYZE TABLE
在REPAIR TABLE
映射OPTIMIZE TABLE
到ALTER TABLE
打开DROP TABLE
表 中的任何表上使用 。如果这样做,该表可能仍会引用原始表并产生意外结果。要解决此问题,请在执行任何指定操作之前 通过发出 语句来确保没有 表保持打开状态。DELETE
WHERE
TRUNCATE TABLE
MERGE
MERGE
MERGE
FLUSH TABLES
MERGE
意外结果包括对表的操作报告表损坏 的可能性。如果这发生在对基础表进行的命名操作之一之后MyISAM
,则损坏消息是虚假的。要处理此问题,FLUSH TABLES
请在修改MyISAM
表后发出一条语句。DROP TABLE
on a table that is in use by aMERGE
table在Windows上不起作用,因为MERGE
存储引擎的表映射对MySQL的上层是隐藏的。Windows 不允许删除打开的文件,因此您首先必须刷新所有MERGE
表(使用FLUSH TABLES
)或删除MERGE
表,然后再删除表。在访问表时检查表的定义
MyISAM
和MERGE
表(例如,作为SELECT
orINSERT
语句的一部分)。这些检查通过比较列顺序、类型、大小和相关索引来确保表的定义和父MERGE
表定义匹配。如果表之间存在差异,则返回错误且语句失败。因为这些检查是在打开表时进行的,所以对单个表定义的任何更改(包括列更改、列排序和引擎更改)都会导致语句失败。MERGE
表及其基础表 中的索引顺序应相同。如果您使用ALTER TABLE
向UNIQUE
表中使用的MERGE
表添加索引,然后使用 在表ALTER TABLE
上添加非唯一索引,MERGE
如果基础表中已经存在非唯一索引,则索引顺序对于表是不同的。(发生这种情况是因为ALTER TABLE
将UNIQUE
索引放在非唯一索引之前以便于快速检测重复键。)因此,对具有此类索引的表的查询可能会返回意外结果。如果遇到类似ERROR 1017 (HY000): Can't find file: '
tbl_name
.MRG' (errno: 2)的错误信息,一般说明部分底层表没有使用MyISAM
存储引擎。确认所有这些表都是MyISAM
.表中的最大行数
MERGE
为 2 64(~1.844E+19;与MyISAM
表相同)。不可能将多个MyISAM
表合并到一个MERGE
行数超过此数量的表中。目前已知将不同行格式 的基础
MyISAM
表与父表一起使用会失败。MERGE
请参见错误 #32364。生效时 不能更改非临时
MERGE
表的联合列表。LOCK TABLES
以下 不起作用:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...; LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE; ALTER TABLE m1 ... UNION=(t1,t2) ...;
但是,您可以使用临时
MERGE
表来执行此操作。您不能使用 来创建
MERGE
表CREATE ... SELECT
,既不能作为临时MERGE
表,也不能作为非 临时MERGE
表。例如:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;
尝试这样做会导致错误:
tbl_name
is notBASE TABLE
。在某些情况下,如果基础表包含或 列,则基础表和基础表
PACK_KEYS
之间的不同表选项值MERGE
会导致意外结果。作为解决方法,使用 以确保所有涉及的表都具有相同的值。(缺陷号 50646)CHAR
BINARY
ALTER TABLE
PACK_KEYS