Mysql檢視:

orchidllh發表於2005-06-22

修改檢視需要create view 和 delete 許可權。

表和檢視的命令在同一個名稱空間中,所以同一個資料庫不能有表名和檢視名重複。

可以對其他資料庫中的表建檢視

檢視的定義有以下的限制:
1、from子句中不能有子查詢
2、select不能指向系統或者使用者的變數
3、select不能指向prepared語法引數
4、定義中的表或檢視必須存在
5、不能對臨時表建檢視,也不能建臨時檢視
6、檢視定義中的表名必須已經存在
7、不能在觸發器和檢視之間建關聯


ORDER BY可以用在檢視定義中,但是如果訪問檢視的select中使用的order by,則檢視定義中的ORDER BY被忽略。

語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

ALGORITHM擴充套件了標準sql,有三個值,預設值是UNDEFINED,預演算法則決定了mysql如何處理檢視。
對於臨時表方式,會將檢視的結果放置到臨時表中,然後使用臨時表執行sql,這樣的好處是在臨時表建完之後,就會釋放在原表上面的鎖,這樣比MERGE方式更快的釋放在訪問的表上的鎖。
對於UNDEFINED方式,是指有系統自己決定使用臨時表方式還是MERGE方式,MERGER方式更高效,且臨時表方式不能更新檢視的資料。

對於MERGE方式,實際上是把訪問檢視的SQL拼接到檢視本身的sql上面。要求檢視的行和表的行之間是一一對應的,如果不存在
這樣的一一對應的關係,則會切換到臨時表演算法。
包含以下關鍵字的sql,不能使用merge方式:
聚合函式(sum,min,max,count等等)
distinct
group by
having
union或者union all
常量檢視

另外,這些檢視的紀錄也是不能更新和刪除的,不能更新和刪除紀錄的檢視除了以上那些情況外,還包括:
select中包含子查詢
join
from一個不能更新的檢視
from一個表的子查詢
演算法是臨時表的檢視

如果檢視還想要可以插入紀錄,則必須滿足以下條件:
檢視必須包含基表沒有預設值的所有欄位
檢視列必須是簡單的對應表的列,沒有在上面進一步的處理。

多於多表檢視的可更新性:
首先必須是基於MERGE演算法的
表連線必須是內連線
檢視中只有一個單表是可以被更新的。

對於多表可更新檢視,如果插入其中一個單表是可以的,刪除紀錄是不允許的

WITH [CASCADED | LOCAL] CHECK OPTION決定了是否允許更新資料使紀錄不再滿足檢視的條件。
這個選項和oracle是類似的
local是隻要滿足本檢視的條件就ok
cascade則是必須滿足所有針對該表的所有檢視的條件才ok。
如果沒有明確是local還是cascade,則預設是cascade。


刪除檢視:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]

顯示檢視內容:
SHOW CREATE VIEW view_name

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/51862/viewspace-180649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章