MySQL local和cascaded檢查選項子句

本教程通過示例和清楚的說明幫助,瞭解WITH CHECK OPTION子句中LOCALCASCADED之間的差異。

在進行本教程之前,應該熟悉WITH CHECK OPTION子句。如果不是這樣,可以參閱WITH CHECK OPTION子句教學來遵循確保視圖的一致性。

LOCAL&CASCADED檢查範圍介紹

當使用WITH CHECK OPTION子句創建視圖時,MySQL會通過視圖檢查正在更改的每個行,例如插入更新刪除,以使其符合視圖的定義。因為MySQL允許基於另一個視圖創建視圖,它還會檢查依賴視圖中的規則以保持一致性。

為了確定檢查的範圍,MySQL提供了兩個選項:LOCALCASCADED。如果您沒有在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 OPTIONWITH CASCADED CHECK OPTION選項的視圖規則。

與使用WITH CASCADED CHECK OPTION的視圖不同,MySQL檢查所有依賴視圖的規則。

請注意,在MySQL 5.7.6之前,如果您使用帶有WITH LOCAL CHECK OPTION的視圖,MySQL只會檢查當前視圖的規則,並且不會檢查底層視圖的規則。


上一篇: MySQL視圖 下一篇: MySQL觸發器