### 16.7.2 合并表问题

以下是已知问题`合并`表：

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

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

-   如果你使用[`更改表`](alter-table.html)改变一个`合并`表到另一个存储引擎，到基础表的映射会丢失。相反，来自底层证券的行`MyISAM`表被复制到更改后的表中，然后使用指定的存储引擎。

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

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

-   因为`合并`引擎无法对一组基础表强制唯一性，[`代替`](replace.html)没有按预期工作。两个关键事实是：

    -   [`代替`](replace.html)只能在要写入的基础表中检测唯一键违规（由`插入方法`选项）。这与违法行为不同`合并`表本身。

    -   如果[`代替`](replace.html)检测到唯一键违规，它只更改它正在写入的基础表中的相应行；也就是说，第一个或最后一个表，由`插入方法`选项。

        类似的考虑适用于[`插入 ... 在重复密钥更新时`](insert-on-duplicate.html).

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

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

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

-   [`删除表`](drop-table.html)在一个正在使用的桌子上`合并`表在 Windows 上不起作用，因为`合并`存储引擎的表映射对 MySQL 上层隐藏。Windows 不允许删除打开的文件，因此您首先必须刷新所有文件`合并`表（与[`同花顺表`](flush.html#flush-tables)) 或删除`合并`删除表之前的表。

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

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

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

-   a 中的最大行数`合并`表是 2<sup>64</sup>(~1.844E+19；和 a 一样`MyISAM`桌子）。无法合并多个`MyISAM`表成一个单一的`合并`行数超过此数量的表。

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

-   您不能更改非临时性的联合列表`合并`表什么时候[`锁定表`](lock-tables.html)生效。以下是*不是*工作：

    ```
    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）
