本教程通過示例和清楚的說明幫助,瞭解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只會檢查當前視圖的規則,並且不會檢查底層視圖的規則。