1. 程式人生 > >MySQL-存儲引擎-MERGE

MySQL-存儲引擎-MERGE

更新 amount mysql- 子句 記錄 -m eat 我們 row

  MERGE存儲引擎是一組Myisam表的組合,這些Myisam表必須結構完全相同,MERGE表本身並沒有數據,
對MERGE類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的Myisam表進行的。對於
MERGE類型表的插入操作,是通過INSERT_METHOD子句定義插入的表,可以有3個不同的值,使用FIRST或
LAST值使得插入操作被相應地作用在第一或最後一個表上,不定義這個子句或者定義為NO,表示不能對這個
MEGRE表執行插入操作。
可以對MERGE表進行DROP操作,這個操作只是刪除MERGE的定義,對內部的表沒有任何的影響。
MERGE在磁盤上保留兩個文件,文件名以表的名字開始,一個.frm文件存儲表定義,另一個.MRG文件
包含組合表的信息,包括MERGE表由哪些表組成、插入新的數據時的依據。
可以通過修改.MRG文件來修改MERGE表,但是修改後要通過FLUSH TABLES 刷新。


mysql>
create table payment_2006( -> country_id smallint, -> payment_date datetime, -> amount decimal(15,2), -> key idx_fk_country_id(country_id))engine=myisam; Query OK, 0 rows affected (0.00 sec) mysql> create table payment_2007( -> country_id smallint, -> payment_date datetime
, -> amount decimal(15,2), -> key idx_fk_country_id(country_id) -> )engine=myisam; Query OK, 0 rows affected (0.00 sec) mysql> create table payment_all( -> country_id smallint, -> payment_date datetime, -> amount decimal(15,2), -> index(country_id)
-> )engine=merge union=(payment_2006,payment_2007) insert_method=last; Query OK, 0 rows affected (0.01 sec) mysql> insert into payment_2006 values (1,2006-05-01,100000),(2,2006-08-15,150000); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into payment_2007 values (1,2007-02-20,350000),(2,2007-07-15,220000); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 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.00 sec) mysql> select * from payment_2007; +------------+---------------------+-----------+ | country_id | payment_date | amount | +------------+---------------------+-----------+ | 1 | 2007-02-20 00:00:00 | 350000.00 | | 2 | 2007-07-15 00:00:00 | 220000.00 | +------------+---------------------+-----------+ 2 rows in set (0.00 sec) mysql> select * from payment_all; +------------+---------------------+-----------+ | country_id | payment_date | amount | +------------+---------------------+-----------+ | 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 | 350000.00 | | 2 | 2007-07-15 00:00:00 | 220000.00 | +------------+---------------------+-----------+ 4 rows in set (0.00 sec)
#可以發現,payment_all 表中的數據payment_2006 和payment_2007表的記錄合並後的結果集。
在payment_all表插入一條數據後,由於MERGE表的定義是insert_method=last,會向表中最後一個插入記錄,
雖然數據插入的是2006年的,但2007表中仍然會寫到。
mysql
> insert into payment_all values(3,2006-03-31,112200); Query OK, 1 row affected (0.00 sec) mysql> select * from payment_all; +------------+---------------------+-----------+ | country_id | payment_date | amount | +------------+---------------------+-----------+ | 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 | 350000.00 | | 2 | 2007-07-15 00:00:00 | 220000.00 | | 3 | 2006-03-31 00:00:00 | 112200.00 | +------------+---------------------+-----------+ 5 rows in set (0.00 sec) mysql> select * from payment_2007; +------------+---------------------+-----------+ | country_id | payment_date | amount | +------------+---------------------+-----------+ | 1 | 2007-02-20 00:00:00 | 350000.00 | | 2 | 2007-07-15 00:00:00 | 220000.00 | | 3 | 2006-03-31 00:00:00 | 112200.00 | +------------+---------------------+-----------+ 3 rows in set (0.00 sec)

#這也是MERGE表和分區表的區別,MERGE表並不能智能地將記錄寫到對應的表中,而分區表示可以的
(分區功能在5.1中推出)通常我們使用MERGE表來透明的對多個表進行查詢和更新操作,而對這種按照時間記錄的操作日誌表
則可以透明的進行插入操作。

MySQL-存儲引擎-MERGE