MERGE 存儲引擎,主要用於合併多張表結構相同的 MyISAM 表數據(類似union all,不是union,因爲數據不會去重),merge 表實際不存儲數據。實踐記錄如下:
1、創建三張相同表結構的 MyISAM 表:payment_2006、payment_2007、payment_2008:
create table payment_2006
(
country_id smallint,
payment_date datetime,
amount decimal(15,2),
key idx_fk_country_id(country_id)
) engine=myisam;
create table payment_2007
(
country_id smallint,
payment_date datetime,
amount decimal(15,2),
key idx_fk_country_id(country_id)
) engine=myisam;
create table payment_2008
(
country_id smallint,
payment_date datetime,
amount decimal(15,2),
key idx_fk_country_id(country_id)
) engine=myisam;
2、分別向 payment_2006 、 payment_2007 、payment_2008表中插入測試數據:
insert into payment_2006 values(1,'2006-05-01',100000),(2,'2006-08-15',150000);
insert into payment_2007 values(1,'2007-02-20',35000),(2,'2007-07-15',220000);
insert into payment_2008 values(1,'2008-08-08',18000),(2,'2008-03-15',380000);
3、分別查看這三表張的記錄:
mysql> select * from payment_2006;
+------------+---------------------+-----------+| country_id | payment_date | amount |
+------------+---------------------+-----------+
| 1 | 2006-05-01 00:00:00 | 100000.00 |
| 2 | 2006-08-15 00:00:00 | 150000.00 |
+------------+---------------------+-----------+
2 rows in set (0.01 sec)
mysql> select * from payment_2007;
+------------+---------------------+-----------+
| country_id | payment_date | amount |
+------------+---------------------+-----------+
| 1 | 2007-02-20 00:00:00 | 35000.00 |
| 2 | 2007-07-15 00:00:00 | 220000.00 |
+------------+---------------------+-----------+
2 rows in set (0.00 sec)
mysql> select * from payment_2008;
+------------+---------------------+-----------+
| country_id | payment_date | amount |
+------------+---------------------+-----------+
| 1 | 2008-08-08 00:00:00 | 18000.00 |
| 2 | 2008-03-15 00:00:00 | 380000.00 |
+------------+---------------------+-----------+
2 rows in set (0.00 sec)
4、創建 merge 引擎類型的 payment_all 表:
CREATE TABLE payment_all(
country_id smallint,
payment_date datetime,
amount DECIMAL(15,2),
INDEX(country_id)
)engine=merge union=(payment_2008,payment_2006,payment_2007) INSERT_METHOD=FIRST;
說明: union指定要合併的 MyISAM表;INSERT_METHOD表示當向這個merge引擎類型的payment_all 表插入數據時,數據是插入到union參數指定的哪張表(FIRST:表示插入到第一張表,LAST:表示插入到最後一張表)。
5、查看merge引擎類型 payment_all 虛擬合併表的結果:
mysql> select * from payment_all;
+------------+---------------------+-----------+
| country_id | payment_date | amount |
+------------+---------------------+-----------+
| 1 | 2008-08-08 00:00:00 | 18000.00 |
| 2 | 2008-03-15 00:00:00 | 380000.00 |
| 1 | 2006-05-01 00:00:00 | 100000.00 |
| 2 | 2006-08-15 00:00:00 | 150000.00 |
| 1 | 2007-02-20 00:00:00 | 35000.00 |
| 2 | 2007-07-15 00:00:00 | 220000.00 |
+------------+---------------------+-----------+
說明:因爲在創建 payment_all時,union參數指定的第一張表是 payment_2008,所以先顯示payment_2008表的數據。
6、向merge引擎類型 payment_all 虛擬合併表插入數據:
insert into payment_all values(3,'2006-01-01',9999);
7、檢查插入的數據:
mysql> select * from payment_all;
+------------+---------------------+-----------+
| country_id | payment_date | amount |
+------------+---------------------+-----------+
| 1 | 2008-08-08 00:00:00 | 18000.00 |
| 2 | 2008-03-15 00:00:00 | 380000.00 |
| 3 | 2006-01-01 00:00:00 | 9999.00 |
| 1 | 2006-05-01 00:00:00 | 100000.00 |
| 2 | 2006-08-15 00:00:00 | 150000.00 |
| 1 | 2007-02-20 00:00:00 | 35000.00 |
| 2 | 2007-07-15 00:00:00 | 220000.00 |
+------------+---------------------+-----------+
7 rows in set (0.00 sec)
mysql> select * from payment_2008;
+------------+---------------------+-----------+
| country_id | payment_date | amount |
+------------+---------------------+-----------+
| 1 | 2008-08-08 00:00:00 | 18000.00 |
| 2 | 2008-03-15 00:00:00 | 380000.00 |
| 3 | 2006-01-01 00:00:00 | 9999.00 |
+------------+---------------------+-----------+
看到,數據已經插入到了 創建 payment_all 表時union參數指定的第一張表 payment_2008中,因爲創建 payment_all 表時,INSERT_METHOD=FIRST。
(完)