sql中,视图可以使用WITH CHECK OPTION字句,
这个WITH CHECK OPTION是啥意思?干啥的?词源角度讲一下
SQL 中 WITH CHECK OPTION 详解
WITH CHECK OPTION 是 SQL 中视图定义的一个重要子句。让我从词源和原理两个角度详细讲解。
一、WITH CHECK OPTION 是什么?
一句话概括:WITH CHECK OPTION 确保通过视图进行的插入或更新操作,其结果行仍然满足视图的定义条件。
sql
CREATE VIEW high_salary_emp ASSELECT * FROM emp WHERE sal > 5000WITH CHECK OPTION;
加上 WITH CHECK OPTION 后,通过这个视图插入或修改的数据,必须保证 sal > 5000 这个条件仍然成立。
二、词源角度
| 单词/短语 | 词源 | 含义 |
|---|---|---|
| WITH | 古英语 wiþ(伴随、一起) | 带着、具有 |
| CHECK | 古法语 eschequier(检查、验证)→ 英语 check | 检查、核对 |
| OPTION | 拉丁语 optio(选择、可选) | 选项、可选功能 |
CHECK 的词源演变
text
古法语 eschequier(棋盘、下棋) ↓ 英语 check(国际象棋中的"将军") ↓ 引申为"检查、核对"(如同将军时检查对方王的位置) ↓ SQL 中的 CHECK(检查条件是否满足)
字面意思:带着检查的选项 → 在操作时进行检查的选项
三、为什么需要 WITH CHECK OPTION?
问题场景:没有 WITH CHECK OPTION
sql
-- 创建视图:只显示工资 > 5000 的员工CREATE VIEW high_salary_emp ASSELECT * FROM emp WHERE sal > 5000;-- 通过视图更新:把工资改成 3000UPDATE high_salary_emp SET sal = 3000 WHERE emp_id = 101;
问题:更新后,这条记录 sal=3000,不再满足 sal > 5000 的条件。这条记录从视图中消失了,但还在原表中!

这就是 "视图中消失的数据" 问题。
四、WITH CHECK OPTION 的作用
sql
-- 加上 WITH CHECK OPTIONCREATE VIEW high_salary_emp ASSELECT * FROM emp WHERE sal > 5000WITH CHECK OPTION;-- 尝试更新:把工资改成 3000UPDATE high_salary_emp SET sal = 3000 WHERE emp_id = 101;
结果:❌ 报错!WITH CHECK OPTION 阻止了这个更新。
text
错误信息:视图 WITH CHECK OPTION 子句违反
五、可视化对比


六、WITH CHECK OPTION 的适用场景
| 操作 | 是否受 CHECK OPTION 影响 |
|---|---|
| SELECT | ❌ 不影响(只是查询) |
| INSERT | ✅ 影响(新行必须满足视图条件) |
| UPDATE | ✅ 影响(更新后的行必须满足视图条件) |
| DELETE | ❌ 不影响(删除不违反条件) |
七、代码示例
示例1:INSERT 被阻止
sql
CREATE VIEW high_salary_emp ASSELECT * FROM emp WHERE sal > 5000WITH CHECK OPTION;-- ❌ 报错!新员工工资 4000 不满足 sal > 5000INSERT INTO high_salary_emp VALUES (103, '王五', 4000);-- ✅ 成功!新员工工资 6000 满足条件INSERT INTO high_salary_emp VALUES (104, '赵六', 6000);
示例2:UPDATE 被阻止
sql
-- ❌ 报错!把工资从 6000 改成 4000,不满足条件UPDATE high_salary_emp SET sal = 4000 WHERE emp_id = 104;-- ✅ 成功!改成 8000,仍满足条件UPDATE high_salary_emp SET sal = 8000 WHERE emp_id = 104;
示例3:DELETE 不受影响(重点!)
sql
-- ✅ 可以删除!删除不违反条件DELETE FROM high_salary_emp WHERE emp_id = 104;
为什么 DELETE 不受影响? 因为删除只是移除数据,不涉及"修改后的行是否满足条件"的问题。
八、WITH CASCADED CHECK OPTION vs WITH LOCAL CHECK OPTION
| 选项 | 含义 | 检查范围 |
|---|---|---|
WITH CHECK OPTION | 默认等同于 CASCADED | 检查当前视图和底层所有视图 |
WITH CASCADED CHECK OPTION | 级联检查 | 检查当前视图和所有依赖视图 |
WITH LOCAL CHECK OPTION | 本地检查 | 只检查当前视图,不检查底层视图 |
示例
sql
-- 底层视图CREATE VIEW v1 AS SELECT * FROM emp WHERE sal > 5000;-- 上层视图CREATE VIEW v2 AS SELECT * FROM v1 WHERE dept_id = 10WITH LOCAL CHECK OPTION; -- 只检查 dept_id=10,不检查 sal>5000
九、总结
| 问题 | 答案 |
|---|---|
WITH CHECK OPTION 是什么? | 视图的一个选项,确保插入/更新后的行满足视图定义条件 |
| 词源 | CHECK 来自古法语"检查",OPTION 来自拉丁语"选择" |
| 为什么需要? | 防止通过视图修改数据后,记录从视图中"消失" |
| 影响哪些操作? | INSERT 和 UPDATE(不影响 DELETE 和 SELECT) |
| 不加会怎样? | 可以修改成不满足条件的数据,记录从视图中消失 |
一句话总结:WITH CHECK OPTION 如其名——带着"检查"的"选项",确保通过视图进行的数据修改(INSERT/UPDATE)仍然满足视图的定义条件,防止修改后的数据从视图中"溜走"(消失)。就像一扇门的看守,只允许符合条件的人进入(INSERT)或改变后仍符合条件(UPDATE),否则就拦住不让过