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
相关产品推荐
相关产品推荐

