乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

修改视图与检查选项

导学

视图创建后,业务需求可能变化——底层表加了新列、过滤条件需要调整、或者要防止用户通过视图"钻空子"插入不符合规则的数据。ALTER VIEW 让你无需删除重建就能修改视图定义,WITH CHECK OPTION 则是一道安全闸门。

定义

ALTER VIEW:修改已有视图的定义语句,效果等同于 DROP VIEW + CREATE VIEW,但权限和依赖关系保持不变。

WITH CHECK OPTION:视图选项,要求通过视图进行的 INSERT 或 UPDATE 必须满足视图的 WHERE 条件,否则拒绝操作。

场景一:ALTER VIEW 修改视图定义

当前数据状态:已有视图 tech_employees,基于 employees 表。

CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(20),
    dept VARCHAR(20),
    score DECIMAL(5,2)
);

INSERT INTO employees (emp_name, dept, score) VALUES
('大翔', '技术部', 100),
('白歌', '产品部', 85);

-- 创建初始视图:只查技术部
CREATE VIEW tech_employees AS
SELECT emp_id, emp_name, dept, score FROM employees WHERE dept = '技术部';

SELECT * FROM tech_employees;
emp_idemp_namedeptscore
1大翔技术部100

操作语句:业务变化,需要视图同时包含技术部和产品部,且只展示 score >= 90 的员工。

ALTER VIEW tech_employees AS
SELECT emp_id, emp_name, dept, score
FROM employees
WHERE dept IN ('技术部', '产品部') AND score >= 90;

SELECT * FROM tech_employees;

操作后数据状态:

emp_idemp_namedeptscore
1大翔技术部100

结果解读:ALTER VIEW 直接替换了视图的底层 SELECT 定义。白歌虽然属于产品部,但 score 为 85(< 90),因此不显示。视图权限、依赖它的其他对象均不受影响。

验证视图定义已更新:

SHOW CREATE VIEW tech_employees;

输出中 AS 后面的 SELECT 已变为新的过滤条件。

场景二:WITH CHECK OPTION 防止数据"逃逸"

当前数据状态:基于上面的 employees 表,重建一个严格视图。

-- 重建视图:只包含技术部员工,并加上检查选项
ALTER VIEW tech_employees AS
SELECT emp_id, emp_name, dept, score
FROM employees
WHERE dept = '技术部'
WITH CHECK OPTION;

SELECT * FROM tech_employees;
emp_idemp_namedeptscore
1大翔技术部100

操作语句:尝试通过视图插入一条"产品部"员工——这不符合视图 dept = '技术部' 的条件。

INSERT INTO tech_employees (emp_name, dept, score) VALUES ('小崔', '产品部', 90);

操作后数据状态:

ERROR 1369 (HY000): CHECK OPTION violation 'tech_employees'

结果解读:WITH CHECK OPTION 拦截了这条插入。虽然底层表 employees 可以存放任何部门的员工,但通过 tech_employees 视图插入时,必须满足 dept = '技术部'。

插入合法数据验证:

INSERT INTO tech_employees (emp_name, dept, score) VALUES ('小崔', '技术部', 90);

SELECT * FROM tech_employees;
emp_idemp_namedeptscore
1大翔技术部100
3小崔技术部90

结果解读:dept = '技术部' 满足视图条件,插入成功。数据实际进入了底层 employees 表。

场景三:UPDATE 也受 CHECK OPTION 约束

当前数据状态:tech_employees 视图有 WITH CHECK OPTION,包含大翔和小崔。

操作语句:尝试通过视图把大翔调到产品部。

UPDATE tech_employees SET dept = '产品部' WHERE emp_id = 1;

操作后数据状态:

ERROR 1369 (HY000): CHECK OPTION violation 'tech_employees'

结果解读:UPDATE 后的新行(dept = '产品部')不满足视图 WHERE dept = '技术部',因此被拒绝。WITH CHECK OPTION 同时约束 INSERT 和 UPDATE。

合法更新验证:

UPDATE tech_employees SET score = 95 WHERE emp_id = 3;

SELECT * FROM tech_employees WHERE emp_id = 3;
emp_idemp_namedeptscore
3小崔技术部95

结果解读:只修改 score 不影响 dept,满足视图条件,更新成功。

常见误区

误区正解
ALTER VIEW 会丢失权限不会。ALTER VIEW 保留原有权限设置,比 DROP + CREATE 更安全。
WITH CHECK OPTION 影响底层表不影响。它只约束通过该视图进行的 INSERT/UPDATE,直接操作底层表不受限制。
没有 WITH CHECK OPTION 的视图也能阻止非法插入不能。没有该选项时,通过视图插入不符合 WHERE 条件的数据会"静默成功",但之后查视图看不到这条数据(数据"逃逸"到底层表)。

面试考点

Q:ALTER VIEW 和 DROP + CREATE VIEW 的区别?

ALTER VIEW 修改定义但保留权限和依赖关系;DROP + CREATE 会丢失权限,且如果其他对象依赖该视图可能报错(需重新授权)。

Q:WITH CHECK OPTION 的作用?

确保通过视图插入或更新的数据必须满足视图的 WHERE 条件,防止数据"逃逸"(插入后通过视图查不到)。

Q:多层视图嵌套时 CHECK OPTION 怎么生效?

MySQL 5.7 支持 WITH LOCAL CHECK OPTION(只检查当前视图条件)和 WITH CASCADED CHECK OPTION(检查当前视图及所有底层视图条件,默认)。

小结

  • ALTER VIEW 用于修改已有视图的 SELECT 定义,无需删除重建
  • WITH CHECK OPTION 防止通过视图插入/更新不符合视图条件的数据
  • 没有检查选项时,数据可能"逃逸"到底层表,造成逻辑混乱
  • 多层视图嵌套时注意 LOCAL 与 CASCADED 的检查范围差异

清理测试数据:

DROP VIEW IF EXISTS tech_employees;
DROP TABLE IF EXISTS employees;
上一页
视图
下一页
外键