一、Merge引擎是一組MyISAM表的組合,組合的分表結構必須完全相同,Merge表本身沒有數據,對Merge表的操作實際上都是對子表的操作,只是對上層訪問來說是透明的,在插入的時候默認是插入到最后一張子表上,也可以指定插入到第一張子表上。
二、示例
使用數據表AuthTrace為例子,表結構為
CREATE TABLE `AuthTrace` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`AuthId` char(255) DEFAULT NULL,
`Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加記錄的當前時間',
`UserIp` varchar(255) DEFAULT NULL COMMENT '用戶Ip',
`Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式',
`ExtraInfo` varchar(255) DEFAULT NULL COMMENT '額外信息',
`UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=770 DEFAULT CHARSET=utf8;
基本操作是:新建2張表AuthTrace1、AuthTrace2,將AuthTrace表的數據插入這兩張表,然后新建一張merge表,然后CURD都可以針對這張merge表了。
,注意這兩張表的引擎為MyISAM,而merge表的引擎是MERGE
創建AuthTrace1、AuthTrace2表
CREATE TABLE `AuthTrace1` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `AuthId` char(255) DEFAULT NULL, `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加記錄的當前時間', `UserIp` varchar(255) DEFAULT NULL COMMENT '用戶Ip', `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式', `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '額外信息', `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址', PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `AuthTrace2` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `AuthId` char(255) DEFAULT NULL, `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加記錄的當前時間', `UserIp` varchar(255) DEFAULT NULL COMMENT '用戶Ip', `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式', `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '額外信息', `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址', PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入數據
insert into AuthTrace1 select * from AuthTrace where id%2=0 insert into AuthTrace2 select * from AuthTrace where id%2=1
結果:
AuthTrace1中的id為偶數,AuthTrace2中的數據為奇數
創建AuthTrace_Merge表,表結構需要跟AuthTrace1、AuthTrace2數據結構一致,
CREATE TABLE `AuthTrace_Merge` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `AuthId` char(255) DEFAULT NULL, `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加記錄的當前時間', `UserIp` varchar(255) DEFAULT NULL COMMENT '用戶Ip', `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式', `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '額外信息', `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址', PRIMARY KEY (`Id`) )ENGINE=MERGE DEFAULT CHARSET=utf8 INSERT_METHOD=LAST AUTO_INCREMENT=1 UNION=(`AuthTrace1`,`AuthTrace2`);
INSERT_METHOD:表示插入方式;
INSERT_METHOD=LAST 添加數據的時候插入到最后一個表,這里就是t2
INSERT_METHOD=FIRST 添加數據的時候插入到第一個表,這里就是t1
INSERT_METHOD=0 不允許插入
UNION = (`AuthTrace1`,`AuthTrace2`) 關聯AuthTrace1和AuthTrace2表
Merge表 數據結構必須和分表完全一致
三、缺點
Authtrace1表中的id是偶數,Authtraace2表中id是奇數。假如INSERT_METHOD=LAST,也就是新的數據會插入到最后一張表,即Authtrace2表。
執行sql:
INSERT INTO `AuthTrace_Merge` VALUES ('2', '12222', '2019-05-21 10:06:50', '172.14.4.4', '2019-05-21', null, null);
那么Authtrace2表中會有這條id=2的數據。由於Authtrace1表中已經有了一個id=2的數據。所以執行sql
檢索出來了,id=2的數據有兩條,位於不同的字表,id明明是自增列,現在確重復了,關鍵是因為有2個字表,而插數據的時候不會每個字表檢查id是否重復的,所以這是個缺點。