花了國(guó)慶的部分時(shí)間,終于完成了這個(gè)教程的翻譯了,現(xiàn)在可以想象當(dāng)年候捷先生翻譯Think in Java是多么困難的了,唉,累啊,好久沒(méi)運(yùn)動(dòng)過(guò)了,快找個(gè)機(jī)會(huì)去玩玩。可惜深圳沒(méi)什么地方可以運(yùn)動(dòng)的,訂運(yùn)動(dòng)場(chǎng)稍微慢一點(diǎn)就沒(méi)了……政府問(wèn)題,不去討論。
回到正題,關(guān)于這個(gè)翻譯我十分推薦大家看看,因?yàn)閷?duì)MySQL來(lái)說(shuō),實(shí)現(xiàn)了視圖確實(shí)是一個(gè)很大的進(jìn)步,而且能給MySQL開(kāi)發(fā)者帶來(lái)的好處不僅僅是速度上的,更多是開(kāi)發(fā)和維護(hù)效率上的改進(jìn)。
這里舉一個(gè)書(shū)中的例子吧:
Example: Constraint checks 示例:約束條件檢查
MySQL支持NOT NULL的列約束,如:
CREATE TABLE t (
column1 INT NOT NULL,
column2 INT NOT NULL);
這并非MySQL約束的全部功能,但是還是不能做到只允許兩列中其中一列可以為空或者讓列1數(shù)值在1到5之間,又或者使列1在某些特殊情況下可以為空。不過(guò),我們可以使用視圖的定義通過(guò)下面的方法實(shí)現(xiàn):
CREATE TABLE t (column1 INT, column2 INT);
CREATE VIEW v AS
SELECT column1, column2 FROM t
WHERE (column1 is NOT NULL OR column2 IS NOT NULL)
AND column1 BETWEEN 1 AND 5
WITH CHECK OPTION;
之后就可以通過(guò)對(duì)視圖v進(jìn)行插入或更新,達(dá)到我前面所需要的效果,在特殊情況下允許為空。
是不是比較有用呢?前面我寫(xiě)了篇關(guān)于MySQL子查詢的文章,但有了視圖其實(shí)可以免去部分使用子查詢的情況,大家看看下面這個(gè)例子吧:
示例:子查詢的替代
在MySQL 4.1版本以后就開(kāi)始支持FROM語(yǔ)句中的子查詢了,例如:
SELECT *
FROM (SELECT * FROM t2 UNION SELECT * FROM t3) AS t2_t3;
但是下面這樣做會(huì)更好:
CREATE VIEW t2_t3 AS
SELECT * FROM t2 UNION SELECT * FROM t3;
SELECT * FROM t2_t3;
把這個(gè)轉(zhuǎn)化為對(duì)視圖的查詢會(huì)更好更方便,因?yàn)槟憧赡軙?huì)使用復(fù)雜的對(duì)大數(shù)字的查詢語(yǔ)句(比方說(shuō)55個(gè)字),語(yǔ)句中包括對(duì)系統(tǒng)變量的一些定義,那如果有人改變了表t2,你可能要改這個(gè)55字的SELECT語(yǔ)句,然而使用視圖,一切都沒(méi)變,你需要改的只是視圖定義中的表名。
另一個(gè)子查詢的例子:在MySQL 5.0.3中不允許使用AVG(DISTINCT ...),因?yàn)橄旅孢@個(gè)語(yǔ)句是非法語(yǔ)句:
SELECT AVG(DISTINCT column1) FROM t;
但采用下面方法能實(shí)現(xiàn)一樣的效果,而且是合法的:
CREATE VIEW v AS SELECT DISTINCT column1 FROM t;
SELECT AVG(column1) FROM v;
下面是中文版的下載地址:
http://www.tkk7.com/Files/chenpengyi/MySQL-Views-Translation-CN.rar
轉(zhuǎn)載時(shí)保留個(gè)人及出處信息,否則可能被視為侵權(quán),呵呵。
如果需要英文原版,可以到下面地址下載:
http://dev.mysql.com/tech-resources/articles/mysql-views.pdf