You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0+中LOCAL与CASCADED WITH CHECK OPTION的差异及示例需求

MySQL 8.0中WITH CHECK OPTION的LOCAL与CASCADED差异解析

MySQL 8.0对WITH CHECK OPTION的LOCAL和CASCADED子句逻辑做了调整,光看文档容易混淆,咱们通过实际示例拆解核心差异:


准备基础环境

先创建测试表和初始数据:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50),
    salary INT
);

INSERT INTO employees VALUES
(1, 'Alice', 'HR', 5000),
(2, 'Bob', 'Engineering', 8000),
(3, 'Charlie', 'HR', 6000),
(4, 'Dave', 'Engineering', 9000);

示例1:底层视图无WITH CHECK OPTION

1. 创建底层视图(仅过滤数据,无检查规则)

CREATE VIEW v_hr AS
SELECT * FROM employees WHERE department = 'HR';

这个视图只显示HR部门员工,但没有限制插入/更新的规则。

2. 创建带LOCAL检查的上层视图

CREATE VIEW v_hr_high_local AS
SELECT * FROM v_hr WHERE salary > 5500
WITH LOCAL CHECK OPTION;

3. 创建带CASCADED检查的上层视图

CREATE VIEW v_hr_high_cascaded AS
SELECT * FROM v_hr WHERE salary > 5500
WITH CASCADED CHECK OPTION;

测试插入操作

  • 插入到LOCAL视图:
INSERT INTO v_hr_high_local VALUES (5, 'Eve', 'Engineering', 6000);

✅ 执行成功。原因:LOCAL仅检查当前视图的规则(salary>5500满足),递归检查底层视图时,由于v_hr未定义WITH CHECK OPTION,不会强制校验department='HR'的条件。数据会插入基表,但不会出现在v_hr和v_hr_high_local视图中。

  • 插入到CASCADED视图:
INSERT INTO v_hr_high_cascaded VALUES (5, 'Eve', 'Engineering', 6000);

❌ 执行报错(Check constraint 'v_hr_high_cascaded_chk_1' is violated)。原因:CASCADED先检查当前视图规则,再递归检查底层视图时,会临时为底层视图添加WITH CASCADED CHECK OPTION,强制校验v_hr的department='HR'条件,数据不符合被拦截。


示例2:底层视图带WITH CHECK OPTION

1. 创建带LOCAL检查的底层视图

CREATE VIEW v_hr_base AS
SELECT * FROM employees WHERE department = 'HR'
WITH LOCAL CHECK OPTION;

2. 创建基于底层视图的LOCAL视图

CREATE VIEW v_hr_high_local2 AS
SELECT * FROM v_hr_base WHERE salary > 5500
WITH LOCAL CHECK OPTION;

3. 创建基于底层视图的CASCADED视图

CREATE VIEW v_hr_high_cascaded2 AS
SELECT * FROM v_hr_base WHERE salary > 5500
WITH CASCADED CHECK OPTION;

测试插入操作

  • 插入到LOCAL视图:
INSERT INTO v_hr_high_local2 VALUES (6, 'Frank', 'Engineering', 7000);

❌ 执行报错。原因:LOCAL检查当前视图规则后,递归检查带WITH CHECK OPTION的底层视图,强制执行v_hr_base的department='HR'规则,数据不符合被拦截。

  • 插入到CASCADED视图:
INSERT INTO v_hr_high_cascaded2 VALUES (6, 'Frank', 'Engineering', 7000);

❌ 执行报错。原因:CASCADED先检查当前视图规则,再递归检查底层视图时,临时将其转为CASCADED模式,同样强制执行department='HR'规则,数据不符合被拦截。


核心差异总结

场景LOCAL CHECK OPTION 行为CASCADED CHECK OPTION 行为
底层视图无CHECK OPTION仅检查当前视图规则,忽略底层视图的WHERE过滤条件临时给底层视图添加CASCADED检查,强制校验所有底层视图的WHERE过滤条件
底层视图有CHECK OPTION递归检查所有带CHECK OPTION的底层视图规则(遵循底层自身的LOCAL/CASCADED逻辑)递归检查时临时将底层视图转为CASCADED模式,强制校验所有底层视图的WHERE过滤条件

内容的提问来源于stack exchange,提问作者tejas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:25:21