# 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)