# 16.7 MERGE 存储引擎
这合并
存储引擎,也称为MRG_MyISAM
引擎,是相同的集合MyISAM
可以作为一张桌子使用。“相同”意味着所有表都具有相同的列数据类型和索引信息。你不能合并MyISAM
列以不同顺序列出的表,对应列中的数据类型不完全相同,或者索引的顺序不同。然而,任何或所有MyISAM
表可以压缩myisampack.看第 4.6.6 节,“myisampack - 生成压缩的只读 MyISAM 表”.诸如此类的表之间的差异无关紧要:
对应列和索引的名称可以不同。
表、列和索引的注释可能不同。
表选项,例如
AVG_ROW_LENGTH
,MAX_ROWS
, 要么PACK_KEYS
可以不同。一个替代品
合并
table 是一个分区表,它将单个表的分区存储在单独的文件中,并使某些操作能够更有效地执行。有关详细信息,请参阅第 24 章,分区.当你创建一个
合并
表,MySQL 创建一个.MRG
磁盘上包含底层证券名称的文件MyISAM
应该作为一个表使用。表格的格式合并
表存储在 MySQL 数据字典中。基础表不必与合并
桌子。
笔记
指某东西的用途合并
表会带来以下安全问题:如果用户有权访问MyISAM
桌子*吨
,该用户可以创建一个合并
桌子米
访问吨
.但是,如果用户的权限吨
随后被撤销,用户可以继续访问吨
通过这样做米
*.
用于删除表
与合并
表只删除合并
规格。基础表不受影响。
创建一个合并
表,您必须指定一个联合=(*
表列表*)
指示哪个选项MyISAM
要使用的表。您可以选择指定一个插入方法
控制如何插入的选项合并
表发生。使用值第一的
要么最后的
分别在第一个或最后一个基础表中进行插入。如果您指定否插入方法
选项,或者如果您将其指定为不
, 插入合并
table 是不允许的,尝试这样做会导致错误。
下面的例子展示了如何创建一个合并
桌子:
mysql> CREATE TABLE t1 (
-> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
-> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
-> a INT NOT NULL AUTO_INCREMENT,
-> message CHAR(20), INDEX(a))
-> ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
柱子一种
被索引为首要的关键
在底层MyISAM
表,但不在合并
桌子。在那里它被索引但不是作为首要的关键
因为一个合并
table 不能对一组基础表强制唯一性。(类似地,一列带有独特
基础表中的索引应在合并
表但不作为独特
指数。)
创建后合并
表,您可以使用它来发出对整个表组进行操作的查询:
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
重新映射一个合并
表到不同的集合MyISAM
表,您可以使用以下方法之一:
降低
这合并
表并重新创建它。采用
更改表 *
tbl_name* 联合=(...)
更改基础表的列表。也可以使用
更改表 ... UNION=()
(也就是说,有一个空的联盟
子句)删除所有基础表。但是,在这种情况下,表实际上是空的并且插入失败,因为没有基础表来获取新行。这样的表可能可用作创建新表的模板合并
表创建表...喜欢
.基础表定义和索引必须与
合并
桌子。当表属于合并
表被打开,而不是当合并
表已创建。如果任何表未通过一致性检查,则触发打开表的操作将失败。这意味着更改一个内表的定义合并
可能会导致失败时合并
表被访问。应用于每个表的一致性检查是:基础表和
合并
表必须具有相同的列数。基础表中的列顺序和
合并
表必须匹配。此外,父中每个对应列的规范
合并
表和基础表进行比较,并且必须满足以下检查:基础表中的列类型和
合并
表必须相等。基础表中的列长度和
合并
表必须相等。基础表的列和
合并
表可以空值
.
基础表的索引必须至少与
合并
桌子。基础表的索引可能比合并
表,但不能少。笔记
存在一个已知问题,即相同列上的索引必须以相同的顺序排列,在
合并
表和底层证券MyISAM
桌子。请参阅错误 #33653。每个索引必须满足以下检查:
基础表的索引类型和
合并
表必须相同。基础表的索引定义中的索引部分(即复合索引中的多个列)的数量和
合并
表必须相同。对于每个索引部分:
索引部分的长度必须相等。
索引部分类型必须相同。
索引部分语言必须相同。
检查索引部分是否可以
空值
.
如果一个
合并
由于基础表存在问题,无法打开或使用表,检查表
显示有关哪个表导致问题的信息。
# 其他资源
- 一个专门的论坛
合并
存储引擎可在https://forums.mysql.com/list.php?93 (opens new window).