# 16.7.2 合并表问题

以下是已知问题合并表:

  • 在 5.1.23 之前的 MySQL Server 版本中,可以使用非临时子 MyISAM 表创建临时合并表。

    从版本 5.1.23 开始,MERGE 子项通过父表锁定。如果父母是临时的,它没有被锁定,所以孩子也没有被锁定。MyISAM 表的并行使用破坏了它们。

  • 如果你使用更改表改变一个合并表到另一个存储引擎,到基础表的映射会丢失。相反,来自底层证券的行MyISAM表被复制到更改后的表中,然后使用指定的存储引擎。

  • 插入方法表选项合并表显示哪个底层证券MyISAM用于插入的表合并桌子。然而,使用自动递增表选项MyISAM表对插入到合并直到至少有一行被直接插入到表中MyISAM桌子。

  • 一种合并table 不能维护整个表的唯一性约束。当你执行一个插入, 数据进入第一个或最后一个MyISAM表(由插入方法选项)。MySQL 确保唯一键值在该范围内保持唯一MyISAM表,但不是集合中的所有基础表。

  • 因为合并引擎无法对一组基础表强制唯一性,代替没有按预期工作。两个关键事实是:

    • 代替只能在要写入的基础表中检测唯一键违规(由插入方法选项)。这与违法行为不同合并表本身。

    • 如果代替检测到唯一键违规,它只更改它正在写入的基础表中的相应行;也就是说,第一个或最后一个表,由插入方法选项。

      类似的考虑适用于插入 ... 在重复密钥更新时.

  • 合并表不支持分区。也就是说,你不能对一个合并表,也不能任何一个合并表的底层MyISAM表被分区。

  • 你不应该使用分析表,维修台,优化表,更改表,删除表,删除没有在哪里条款,或截断表在映射到打开的任何表上合并桌子。如果您这样做,则合并table 可能仍然引用原始表并产生意外结果。要解决此问题,请确保没有合并通过发出一个表保持打开状态同花顺表执行任何指定操作之前的语句。

    意外结果包括对合并表报告表损坏。如果这发生在对底层证券的命名操作之一之后MyISAM表,损坏消息是虚假的。为了解决这个问题,发出一个同花顺表修改后的声明MyISAM表。

  • 删除表在一个正在使用的桌子上合并表在 Windows 上不起作用,因为合并存储引擎的表映射对 MySQL 上层隐藏。Windows 不允许删除打开的文件,因此您首先必须刷新所有文件合并表(与同花顺表) 或删除合并删除表之前的表。

  • 的定义MyISAM表和合并访问表时检查表(例如,作为选择要么插入陈述)。检查确保表和父表的定义合并通过比较列顺序、类型、大小和相关索引来匹配表定义。如果表之间存在差异,则返回错误并且语句失败。因为这些检查是在打开表时进行的,所以对单个表定义的任何更改(包括列更改、列排序和引擎更改)都会导致语句失败。

  • 索引中的顺序合并表和它的基础表应该是一样的。如果你使用更改表添加一个独特在 a 中使用的表的索引合并表,然后使用更改表合并表,如果基础表中已经存在非唯一索引,则表的索引顺序不同。(发生这种情况是因为更改表看跌期权独特非唯一索引之前的索引,以便快速检测重复键。)因此,对具有此类索引的表的查询可能会返回意外结果。

  • 如果遇到类似 ERROR 1017 (HY000): Can't find file: ' 的错误信息*tbl_name*.MRG' (errno: 2),一般表示部分基础表不使用MyISAM存储引擎。确认所有这些表MyISAM.

  • a 中的最大行数合并表是 264(~1.844E+19;和 a 一样MyISAM桌子)。无法合并多个MyISAM表成一个单一的合并行数超过此数量的表。

  • 底层证券的使用MyISAM具有父级的不同行格式的表合并当前已知表失败。请参阅错误 #32364。

  • 您不能更改非临时性的联合列表合并表什么时候锁定表生效。以下是不是工作:

    CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...;
    LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE;
    ALTER TABLE m1 ... UNION=(t1,t2) ...;
    

    但是,您可以临时执行此操作合并桌子。

  • 你不能创建一个合并表与创建...选择, 既不是临时的合并表,也不是非临时的合并桌子。例如:

    CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;
    

    尝试这样做会导致错误:*tbl_name*不是基表.

  • 在某些情况下,不同PACK_KEYS表中的选项值合并如果基础表包含字符要么二进制列。作为一种解决方法,使用更改表确保所有涉及的表具有相同的PACK_KEYS价值。(错误 #50646)