在MySQL資料庫中對視圖的限制

來源:互聯網
上載者:User

視圖處理功能概念未最佳化:

·不能在視圖上建立索引。

·對於使用MERGE演算法處理的視圖,可以使用索引。但是,對於使用暫存資料表演算法處理的視圖,不能在其基表上利用索引提供的優點(儘管能夠在暫存資料表的產生過程中使用索引)。

在視圖的FROM子句中不能使用子查詢。未來該限制將被放寬。

存在一個一般原則,不能更改某一表並在子查詢的相同表內進行選擇。請參見I.3節,“對子查詢的限制”。

如果從表選擇了視圖並接著從視圖進行了選擇,同樣的原理也適用,如果在子查詢中從表選擇了視圖並使用MERGE演算法評估了視圖,也同樣。例如:

CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS
(SELECT 1 FROM t1 WHERE t1.a = t2.a);
UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;

如果視圖是使用暫存資料表評估的,可從視圖子查詢中的表進行選擇,並仍能更改外部查詢中的表。在該情況下,視圖將被具體化,因此,你實際上不能從子查詢的表中進行選擇並“同時”更改它(這是你打算強制MySQL使用暫存資料表演算法的另一原因,其方法是在視圖定義中指定ALGORITHM = TEMPTABLE關鍵字)。

可以使用DROP TABLE或ALTER TABLE來捨棄或更改視圖定義中使用的表(它會是視圖失效),而且捨棄或更改操作不會導致警示。但在以後使用視圖時會出錯。

視圖定義是通過特定語句“凍結”的:

·如果PREPARE預先處理的語句引用了視圖,以後每次執行語句時看到的視圖內容與預先處理視圖時的內容相同。即使在語句預先處理完成之後、在執行語句之前更改了視圖定義,情況也同樣。例如:

·CREATE VIEW v AS SELECT 1;

·PREPARE s FROM 'SELECT * FROM v';

·ALTER VIEW v AS SELECT 2;

·EXECUTE s;

EXECUTE語句返回的結果是1,而不是2。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.