Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

18.7.2 MERGE 表问题

以下是 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 不会按预期工作。两个关键事实是:

    • REPLACE 只能检测到唯一键违规在它将要写入的基础表中(由 INSERT_METHOD 选项确定)。这与 MERGE 表本身的违规不同。

    • 如果 REPLACE 检测到唯一键违规,它将只更改它将要写入的基础表中的相应行;即第一个或最后一个表,由 INSERT_METHOD 选项确定。

    类似的考虑也适用于 INSERT ... ON DUPLICATE KEY UPDATE

  • MERGE 表不支持分区。这意味着您不能对 MERGE 表进行分区,也不能对 MERGE 表的基础 MyISAM 表进行分区。

  • 您不应该在打开的 MERGE 表上使用 ANALYZE TABLEREPAIR TABLEOPTIMIZE TABLEALTER TABLEDROP TABLEDELETE without a WHERE 子句或 TRUNCATE TABLE。如果您这样做,MERGE 表可能仍然引用原始表并产生意外结果。要解决这个问题,请确保在执行上述操作之前没有打开的 MERGE 表,方法是发出 FLUSH TABLES 语句。

    意外结果包括 MERGE 表报告表损坏的可能性。如果在对基础 MyISAM 表执行上述操作后出现这种情况,那么损坏信息是虚假的。要处理这种情况,请在修改基础 MyISAM 表后发出 FLUSH TABLES 语句。

  • DROP TABLE 在 Windows 上不能在使用 MERGE 表的表上工作,因为 MERGE 存储引擎的表映射对 MySQL 的上层是隐藏的。Windows 不允许删除打开的文件,因此您必须先刷新所有 MERGE 表(使用 FLUSH TABLES)或删除 MERGE 表,然后才能删除表。

  • 当访问表时(例如,在 SELECTINSERT 语句中),将检查 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 表选项值的差异可能会导致意外的结果,如果基础表包含 CHARBINARY 列。作为解决方法,请使用 ALTER TABLE 确保所有参与表具有相同的 PACK_KEYS 值。(Bug #50646)