相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  MERGE 表问题

18.7.2 MERGE 表问题

以下是关于 MERGE 表的已知问题

  • 在早于 5.1.23 的 MySQL 服务器版本中,可以使用非临时子 MyISAM 表创建临时合并表。

    从 5.1.23 版本开始,MERGE 子表通过父表进行锁定。如果父表是临时的,则不会被锁定,因此子表也不会被锁定。并行使用 MyISAM 表会导致表损坏。

  • 如果您使用 ALTER TABLEMERGE 表更改为其他存储引擎,则对底层表的映射将丢失。相反,来自底层 MyISAM 表的行将被复制到已更改的表中,然后该表使用指定的存储引擎。

  • 用于 MERGE 表的 INSERT_METHOD 表选项指示要使用哪个底层 MyISAM 表来插入到 MERGE 表中。但是,直到至少有一行直接插入到 MyISAM 表中,该 MyISAM 表的 AUTO_INCREMENT 表选项对插入到 MERGE 表中的内容才会生效。

  • 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(不带 WHERE 子句)或 TRUNCATE TABLE。如果您这样做,MERGE 表可能仍然引用原始表,并产生意外的结果。要解决此问题,请在执行任何上述操作之前,通过发出 FLUSH TABLES 语句确保没有打开的 MERGE 表。

    意外结果包括在对 MERGE 表的操作报告表损坏的可能性。如果在对底层 MyISAM 表进行上述操作之一后发生这种情况,则损坏消息是虚假的。为了处理这种情况,在修改 MyISAM 表后,发出 FLUSH TABLES 语句。

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

  • 当访问表(例如,作为 SELECTINSERT 语句的一部分)时,将检查 MyISAM 表和 MERGE 表的定义。这些检查通过比较列顺序、类型、大小和关联索引来确保表定义和父 MERGE 表定义匹配。如果表之间存在差异,则会返回错误,并且语句将失败。由于这些检查在打开表时进行,因此对单个表的定义所做的任何更改,包括列更改、列顺序和引擎更改,都会导致语句失败。

  • MERGE 表及其底层表中的索引顺序应相同。如果您使用 ALTER TABLEMERGE 表中使用的表添加 UNIQUE 索引,然后使用 ALTER TABLEMERGE 表添加非唯一索引,如果底层表中已存在非唯一索引,则表的索引顺序将不同。(这是因为 ALTER TABLEUNIQUE 索引放在非唯一索引之前,以方便快速检测重复键。)因此,对具有此类索引的表的查询可能会返回意外的结果。

  • 如果您遇到类似于 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

  • 在某些情况下,如果底层表包含 CHARBINARY 列,则 MERGE 表和底层表之间不同的 PACK_KEYS 表选项值会导致意外结果。作为解决方法,使用 ALTER TABLE 确保所有涉及的表具有相同的 PACK_KEYS 值。(错误 #50646)