基本表:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)TYPE=MyISAM;
CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID))TYPE=MyISAM;
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST AUTO_INCREMENT=1 UNION=(TEST_MERGE_1,TEST_MERGE_2);
说明:
1. 此表结构必须与基本表彻底一致,包括列名、顺序。UNION表必须同属一个DATABASE。
2. 此表相似于SQL中的union机制。
3. 基本表类型必须是MyISAM的。
4. 能够经过修改.mrg文件来修改MERGE表,每一个基本表的名字占一行。注意:修改后要经过FLUSH TABLES刷新表缓存。
5. 对基本表的更改能够直接反映在此表上。
6. INSERT_METHOD的取值能够是: 0 不容许插入 FIRST 插入到UNION中的第一个表 LAST 插入到UNION中的最后一个表。(4.0以后可用)
7. 定义在它上面的约束没有任何做用,约束是由基本表控制的,例如两个基本表中存在着一样的一个Key值,那么在MERGE表中会有两个同样的Key值。
注意:
1.若是是经过修改.mrg文件的方式来修改MERGE表,那么必定要修改后要经过FLUSH TABLES刷新表缓存,不然修改不会生效。最近犯过一次这样的错误。
2.在数据量、查询量较大的状况下,不要试图使用Merge表来达到相似于Oracle的表分区的功能,会很影响性能。个人感受是和union几乎等价。
3.查询结果及顺序与建立Merge表时联合表的顺序有关。
假设有这样两条个语句:
INSERT INTO TEST_MERGE_1(ID,VALUE) VALUES(1,'ciray');
INSERT INTO TEST_MERGE_2(ID,VALUE) VALUES(1,'blog.csdn.net/ciray');
而后,这个查询:
SELECT * FROM TEST_MERGE WHERE ID=1;
将 只会获得一条记录(1,'ciray'),并非两条记录,也不会是(1,'blog.csdn.net/ciray')。这是由于ID是 PRIMARY KEY,若是在第一个表中查询到记录,则不在后面的表中记录查。若是ID并无定义惟一性约束,则这个查询会获得两条记录。