本教程通過示例和清楚的說明幫助,瞭解WITH CHECK OPTION子句中LOCAL和CASCADED之間的差異。
在進行本教程之前,應該熟悉WITH CHECK OPTION子句。如果不是這樣,可以參閱WITH CHECK OPTION子句教學來遵循確保視圖的一致性。
LOCAL&CASCADED檢查範圍介紹
當使用WITH CHECK OPTION子句創建視圖時,MySQL會通過視圖檢查正在更改的每個行,例如插入,更新,刪除,以使其符合視圖的定義。因為MySQL允許基於另一個視圖創建視圖,它還會檢查依賴視圖中的規則以保持一致性。
為了確定檢查的範圍,MySQL提供了兩個選項:LOCAL和CASCADED。如果您沒有在WITH CHECK OPTION子句中顯式指定關鍵字,則MySQL默認使用CASCADED。
MySQL與CASCADC檢查選項
要瞭解使用CASCADED CHECK OPTION的效果,請參閱下麵的例子。
首先,創建一個名為t1的表,其中只有一個名稱為:c的列,它的數據類型為int。
USE testdb;
CREATE TABLE t1 (
c INT
);
接下來,基於t1表創建一個名為v1的視圖,以選擇值大於10的行記錄。
CREATE OR REPLACE VIEW v1
AS
SELECT
c
FROM
t1
WHERE
c > 10;
因為沒有指定WITH CHECK OPTION,所以以下語句即使不符合v1視圖的定義也可以工作。
INSERT INTO v1(c) VALUES (5);
然後,基於v1視圖創建v2視圖。在v2視圖中添加一個WITH CASCADED CHECK OPTION子句。
CREATE OR REPLACE VIEW v2
AS
SELECT
c
FROM
v1
WITH CASCADED CHECK OPTION;
現在,通過v2視圖在t1表中插入一個值為5的行。
INSERT INTO v2(c) VALUES (5);
MySQL發出以下錯誤消息:
Error Code: 1369. CHECK OPTION failed 'testdb.v2'
它失敗了,因為它創建一個不符合v2視圖定義的新行。
之後,我們再創建一個基於v2的名為v3的新視圖。
CREATE OR REPLACE VIEW v3
AS
SELECT
c
FROM
v2
WHERE
c < 20;
我們通過v3視圖插入一個新行到t1表中,值為8。
INSERT INTO v3(c) VALUES (8);
MySQL發出以下錯誤資訊:
Error Code: 1369. CHECK OPTION failed 'testdb.v3'
上面插入語句看起來符合v3視圖的定義,insert語句仍然執行失敗。
這是為什麼呢?
因為v3視圖取決於v2視圖,v2視圖具有WITH CASCADED CHECK OPTION。
但是,以下插入語句能正常工作。
INSERT INTO v3(c) VALUES (30);
因為v3視圖沒有使用WITH CHECK OPTION定義,並且該語句符合v2視圖的定義。
所以,總而言之:
當視圖使用WITH CASCADED CHECK OPTION時,MySQL會迴圈檢查視圖的規則以及底層視圖的規則。

MySQL WITH LOCAL CHECK OPTION
下麵將演示使用 WITH LOCAL CHECK OPTION 選項,使用上面相同的示例來查看差異。
首先,將v2視圖更改為使用WITH LOCAL CHECK OPTIONS替代。
ALTER VIEW v2 AS
SELECT
c
FROM
v1
WITH LOCAL CHECK OPTION;
其次,插入與上述示例相同的行。
INSERT INTO v2(c) VALUES (5);
它是可以成功執行的。
因為v2視圖沒有任何規則。 v2視圖取決於v1視圖。 但是,v1視圖沒有指定檢查選項,因此MySQL跳過檢查v1視圖中的規則。
請注意,在使用
WITH CASCADED CHECK OPTION創建的v2視圖中,此語句失敗。
第三,通過v3視圖將相同的行插入t1表。
INSERT INTO v3(c) VALUES (8);
在這種情況下可以執行成功,因為MySQL視圖中的WITH LOCAL CHECK OPTIONS選項沒有檢查v1視圖的規則。
另外,請注意,在使用WITH CASCADED CHECK OPTION創建的v2視圖示例中,此語句執行失敗。

因此,如果視圖使用WITH LOCAL CHECK OPTION,MySQL會檢查WITH LOCAL CHECK OPTION和WITH CASCADED CHECK OPTION選項的視圖規則。
與使用WITH CASCADED CHECK OPTION的視圖不同,MySQL檢查所有依賴視圖的規則。
請注意,在MySQL 5.7.6之前,如果您使用帶有
WITH LOCAL CHECK OPTION的視圖,MySQL只會檢查當前視圖的規則,並且不會檢查底層視圖的規則。
