【Mysql學習】MERGE儲存引擎(一)

北在南方發表於2016-04-15

MERGE儲存引擎(一)
MERGE表的問題
   MERGE儲存引擎,也被認識為MRG_MyISAM引擎,是一個相同的可以被當作一個來用的MyISAM表的集合。“相同”意味著所有表同樣的列和索引資訊。你不能合併列被以不同順序列於其中的表,沒有恰好同樣列的表,或有不同順序索引的表。而且,任何或者所有的表可以用myisampack來壓縮。表選項的差異,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。
   當你建立一個MERGE表之時,MySQL在磁碟上建立兩個檔案。檔名以表的名字開始,並且有一個副檔名來指明檔案型別。一個.frm檔案儲存表定義,一個.MRG檔案包含被當作一個來用的表的名字。這些表作為MERGE表自身,不必要在同一個資料庫中。
   你可以對錶的集合用SELECT, DELETE, UPDATE和INSERT。你必須對你對映到一個MERGE表的這些表有SELECT, UPDATE和DELETE 的許可權。
   如果你DROP MERGE表,你僅在移除MERGE規格。底層表沒有受影響。
   當你建立一個MERGE表之時,你必須指定一個UNION=(list-of-tables)子句,它說明你要把哪些表當作一個來用。如果你想要對MERGE表的插入發生在UNION列表中的第一個或最後一個表上,你可以選擇地指定一個INSERT_METHOD選項。使用FIRST或LAST值使得插入被相應地做在第一或最後一個表上。如果你沒有指定INSERT_METHOD選項,或你用一個NO值指定該選項。往MERGE表插入記錄的試圖導致錯誤。

下面例子說明如何建立一個MERGE表:
mysql> create table pay_2009 (
    -> id int,
    -> pay_date datetime,
    -> amount decimal(15,3),
    -> key idx_fk_id(id)
    -> ) engine=myisam;
Query OK, 0 rows affected (0.06 sec)

mysql> create table pay_2010 (
    -> id int,
    -> pay_date datetime,
    -> amount decimal(15,3),
    -> key idx_fk_id(id)
    -> ) engine=myisam;
Query OK, 0 rows affected (0.13 sec)

mysql> create table pay_all (
    -> id int,
    -> pay_date datetime,
    -> amount decimal(15,3),
    -> index (id)
    -> ) engine=merge union=(pay_2009,pay_2010) insert_method=first;
Query OK, 0 rows affected (0.09 sec)
mysql> insert into pay_2009 values(1,`2009-09-27`,10000),(2,`2009-09-17`,20000);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into pay_2010 values(1,`2010-09-27`,10000),(2,`2010-09-17`,20000);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

 

mysql>
注意,一個列在MERGEN表中被索引,但沒有被宣告為一個PRIMARY KEY,因為它是在更重要的MyISAM表中。這是必要的,因為MERGE表在更重要的表中的設定上強制非唯一性。

建立MERGE表之後,你可以發出把一組表當作一體來操作的查詢:

mysql> select * from pay_2009;
+——+———————+———–+
| id   | pay_date            | amount    |
+——+———————+———–+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
+——+———————+———–+
2 rows in set (0.00 sec)

mysql> select * from pay_2010;
+——+———————+———–+
| id   | pay_date            | amount    |
+——+———————+———–+
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+——+———————+———–+
2 rows in set (0.00 sec)

mysql> select * from pay_all;
+——+———————+———–+
| id   | pay_date            | amount    |
+——+———————+———–+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+——+———————+———–+
4 rows in set (0.00 sec)

mysql> insert into pay_all values(3,`2009-12-02`,80000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from pay_2009;
+——+———————+———–+
| id   | pay_date            | amount    |
+——+———————+———–+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
|    3 | 2009-12-02 00:00:00 | 80000.000 |
+——+———————+———–+
3 rows in set (0.00 sec)

mysql> select * from pay_2010;
+——+———————+———–+
| id   | pay_date            | amount    |
+——+———————+———–+
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+——+———————+———–+
2 rows in set (0.00 sec)

mysql> select * from pay_all;
+——+———————+———–+
| id   | pay_date            | amount    |
+——+———————+———–+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
|    3 | 2009-12-02 00:00:00 | 80000.000 |
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+——+———————+———–+
5 rows in set (0.00 sec)
注意,你也可以直接從MySQL之外直接操作.MRG檔案: 


相關文章