mysql merge表介紹,mysqlmerge表

來源:互聯網
上載者:User

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......餘下全文>>
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.