mysql merge表介紹,mysqlmerge表
在Mysql資料庫中,Mysql Merge表有點類似於視圖。下面就讓我們來一起瞭解一下Mysql Merge表都有哪些優點,希望對您能有所協助。
Mysql Merge表的優點:
A: 分離靜態和動態資料
B:利用結構接近的的資料來最佳化查詢
C: 查詢時可以訪問更少的資料
D:更容易維護大資料集
E: 可以通過修改.mrg檔案來修改Merge表,當然也可以用alter進行修改,修改後要通過FLUSH TABLES重新整理表緩衝,此法可以動態增加減少子表
建立方法,例:
mysql>CREATE TABLE t1(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;
mysql>CREATE TABLE t2(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;
mysql>CREATE TABLE mrg(a INT NOT NULL PRIMARY KEY)ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
下面添加測試資料
mysql>INSERT INTO t1(a) VALUES(1),(2);
mysql>INSERT INTO t2(a)VALUES(1),(2);
查詢一下看看結果
mysql>SELECT a FROM mrg;
結果會顯示出t1,t2兩個表中的資料
+------+
| a |
+------+
| 1|
| 2|
| 1|
| 2|
+------+
對於merge表,需要注意的是
1。每個子表的結構必須一致,主表和子表的結構需要一致,
2。每個子表的索引在merge表中都會存在,所以在merge表中不能根據該索引進行唯一性檢索。
3 子表需要是MyISAM引擎
4 REPLACE在merge表中不會工作
5 AUTO_INCREMENT 不會按照你所期望的方式工作。
建立Mysql Merge表的參數 INSERT_METHOD有幾個參數 。
LAST 如果你執行insert 指令來操作merge表時,插入操作會把資料添加到最後一個子表中。FIRST 同理,執行插入資料時會把資料添加到第一個子表中。
比如本例,對merge表執行插入操作
mysql>INSERT INTO mrg(a)VALUES(18);
查詢一下
mysql>SELECT a FROM t2;
結果你會發現18出現在t2表中。
---------------------------------------------------------------
如果你對mrg表或者子表進行了DROP操作,那將有可能會產生些不可預知的情況。
如果刪除mrg表,那麼各個子表間將不會有聯絡。但是如果刪除其中的任一子表,對於GNU/LINUX來說,merge表結構及資料仍然存在。
mysql>DROP TABLE t1,t2;
mysql>SELECT a FROM mrg;
結果你會發現mrg表的查詢結果不變。
他將多個表在邏輯上當作一個表來查詢。他建立後有兩個檔案,
.frm 表結構定義
.mrg union表的名字清單
--
-- merger表的結構 `test_merge`
--
CREATE TABLE IF NOT EXISTS `test_merge` (
`id` int(5) NOT NULL auto_increment,
`names` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=gb2312 INSERT_METHOD=LAST UNION=(`test_merge_1`,`test_merge_2`,`test_merge_3`);
--
-- 匯出表中的資料 `test_merge`
--
INSERT INTO `test_merge` (`id`, `names`) VALUES
(1, 'aa'),
(1, 'bb'),
(1, 'cc');
-- --------------------------------------------------------
--
-- 基本表的結構 `test_merge_1`
--
CREATE TABLE IF NOT EXISTS `test_merge_1` (
`id` int(5) NOT NULL auto_increment,
`names` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=3 ;
--
-- 匯出表中的資料 `test_merge_1`
--
INSERT INTO `test_merge_1` (`id`, `names`) VALUES
(1, 'aa');
-- --------------------------------------------------------
--
--基本 表的結構 `test_merge_2`
--
CREATE TABLE IF NOT EXISTS `test_merge_2` (
`id` int(5) NOT NULL auto_increment,
`names` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=2 ;
--
-- 匯出表中的資料 `test_merge_2`
--
INSERT INTO `test_merge_2` (`id`, `names`) VALUES
(1, 'bb');
-- --------------------------------------------------------
--
-- 基本表的結構 `test_merge_3`
--
CREATE TABLE IF NOT EXISTS `test_merge_3` (
`id` int(5) NOT NULL auto_increment,
`names` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=2 ;
--
-- 匯出表中的資料 `test_merge_3`
--
INSERT INTO `test_merge_3` (`id`, `names`) VALUES
(1, 'cc');
1. 此表類似於SQL中的union機制。
2. 此表結構必須與基本表完全一致,包括列名、順序。UNION表必須同屬一個DATABASE。
3. 基本表類型必須是MyISAM。
4. 可以通過修改.mrg檔案來修改MERGE表,每個基本表的名字佔一行。注意:修改後要通過FLUSH TABLES重新整理表緩衝。
5. 對基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允許插入 FIRST 插入到UNION中的第一個表 LAST 插入到UNION中的最後一個表。(4.0之後可用)
7. 定義在它上面的約束沒有任何作用,約束是由基本表控制的,例如兩個基本表中存在著同樣的一個Key值,那麼在MERGE表中會有兩個一樣的Key值。
MYSQL 多表當作一表查詢
通過建立merge表應該可以實現你的要求
但TB1,TB2必須為myisam
下面是個例子
mysql>CREATE TABLE t1(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;
mysql>CREATE TABLE t2(a INT NOT NULL PRIMARY KEY)ENGINE=MyISAM;
mysql>CREATE TABLE mrg(a INT NOT NULL PRIMARY KEY)ENGINE=MERGE UNION=(t1,t2)
助:mysql的多表關聯更新!!!
在資料庫設計的時候,對於你上面這樣的表,不應該再定義zongping欄位,因為該欄位的數值完全由其它欄位簡單計算得出,在磁碟上儲存它的值完全是浪費空間。
為了搜尋資料的方便,我們應該定義一個表,僅僅包含pingshi、qizhong、qimo三個欄位,然後定義一個視圖(VIEW),視圖包含計算欄位,假設表名為tb,那麼視圖vw的定義語句為:
CREATE VIEW vw (pingshi,qizhong,qimo,zongping)
AS SELECT pingshi,qizhong,qimo,pingshi*0.1+qizhong*0.3+qimo*0.6 FROM tb
這樣以後可以對vw視圖進行查詢,其資料和tb表相同,只是對了計算欄位。
MYSQL裡面建立視圖的語句為:
CREATE VIEW文法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
該語句能建立新的視圖,如果給定了OR REPLACE子句,該語句還能替換已有的視圖。select_statement是一種SELECT語句,它給出了視圖的定義。該語句可從基表或其他視圖進行選擇。
該語句要求具有針對視圖的CREATE VIEW許可權,以及針對由SELECT語句選擇的每一列上的某些許可權。對於在SELECT語句中其他地方使用的列,必須具有SELECT許可權。如果還有OR REPLACE子句,必須在視圖上具有DROP許可權。
視圖屬於資料庫。在預設情況下,將在當前資料庫建立新視圖。要想在給定資料庫中明確建立視圖,建立時,應將名稱指定為db_name.view_name。
mysql> CREATE VIEW test.v AS SELECT * FROM t;
表和視圖共用資料庫中相同的名稱空間,因此,資料庫不能包含具有相同名稱的表和視圖。
視圖必須具有唯一的列名,不得有重複,就像基表那樣。預設情況下,由SELECT語句檢索的列名將用作視圖列名。要想為視圖列定義明確的名稱,可使用可選的column_list子句,列出由逗號隔開的ID。column_list中的名稱數目必須等於SELECT語句檢索的列數。
SELECT語句檢索的列可以是對錶列的簡單引用。也可以是使用函數、常量值、操作符等的運算式。
對於SELECT語句中不合格的表或視圖,將根據預設的資料庫進行解釋。通過用恰當的資料庫名稱限定表或視圖名,視圖能夠參考資料表或其他資料庫中的視圖。
能夠使用多種SELECT語句建立視圖。視圖能夠引用基表或其他視圖。它能使用聯合、UNION和子查詢。SELECT甚至不需引用任何錶。在下面的樣本中,定義了從另一表選擇兩列的視圖,並給出了根據這些列計算的運算式:
mysql>&nb......餘下全文>>