一、修改视图定义 (Schema)

当基础表结构发生变化,或需要改变视图呈现数据的逻辑时,需要修改视图定义。

方法 1:使用 `ALTER VIEW` (推荐)

这是直接修改视图的标准方法。

语法:

ALTER VIEW <视图名> [(列名1, 列名2, ...)]

AS <SELECT语句>

示例:

将视图 `view_students_info` 从选择所有列改为只选择 `id`, `name`, `age` 三列。

ALTER VIEW view_students_info
AS SELECT id, name, age
FROM tb_students_info;

执行后验证:

DESC view_students_info;

输出:

FieldTypeNullKeyDefaultExtra
idint(11)NO
0
namevarchar(45)YES
NULL
ageint(11)YES
NULL


所需权限: 用户必须对视图有 `CREATE VIEW` 和 `DROP` 权限,并对 `SELECT` 语句中涉及的每一列有相应权限。

方法 2:先 `DROP` 再 `CREATE`

另一种等效的方法是先删除旧视图,然后用新定义重新创建。这与 `ALTER VIEW` 的效果相同。

DROP VIEW IF EXISTS view_students_info;
 
CREATE VIEW view_students_info
AS SELECT id, name, age
FROM tb_students_info;

二、通过视图修改数据 (DML)

示例: 通过视图更新数据

UPDATE view_students_info

SET age = 25

WHERE id = 1;

执行结果:

1.  视图 `view_students_info` 中 `id` 为 1 的记录的 `age` 被改为 25。

2.  基础表 `tb_students_info` 中对应的 `age` 字段也被更新为 25。

3.  其他基于同一基础表的视图(如 `v_students_info`)中对应的数据也会同步更新,因为它们查询的是同一份真实数据。

核心原则:对视图的增删改,实质上就是对基础表的增删改。

 

三、可更新视图的条件 (非常重要!)

并非所有视图都可以更新。如果视图包含以下任何元素,则通常是不可更新的:

 类别  不可更新的元素示例

聚合操作`SUM()`, `MIN()`, `MAX()`, `COUNT()`, `AVG()`

数据去重与分组  `DISTINCT`, `GROUP BY`, `HAVING`

集合操作 `UNION`, `UNION ALL`

子查询 选择列表中的子查询,`WHERE` 子句中引用 `FROM` 表子查询

多表/复杂FROM `FROM` 子句包含多个表或另一个不可更新视图

算法选项 `ALGORITHM = TEMPTABLE`(使用临时表实现视图)

缺少基础表必填字段 视图中未包含基础表中没有默认值的 `NOT NULL` 字段

 

简单判断: 视图必须与基础表保持一对一或一对多中“一”这边的关系,才能可靠更新。包含聚合或连接的视图通常无法确定修改应应用于哪一行原始数据。

 

四、修改视图名称

MySQL 没有直接重命名视图的语句。修改视图名称的唯一方法是:

1.  使用 `SHOW CREATE VIEW` 查询旧视图的完整定义。

2.  使用 `DROP VIEW` 删除旧视图。

3. 使用 `CREATE VIEW` 以新的名称,按照查到的定义语句重新创建视图。

示例: 将视图 `old_view_name` 重命名为 `new_view_name`

 1. 查看旧视图的定义(保存好查询到的CREATE语句)

SHOW CREATE VIEW old_view_name;

2. 删除旧视图

DROP VIEW old_view_name;

3. 用新名字创建视图(使用第1步中查到的定义)

CREATE VIEW new_view_name AS ...;  ... 部分替换为第一步查到的SELECT语句

 

总结

 操作类型  主要命令  说明  注意事项

修改定义 `ALTER VIEW ... AS ...` 推荐方法。直接修改视图背后的查询逻辑。  需要相关权限。

修改数据  `UPDATE`  `INSERT`  `DELETE`  通过视图更新基础表的数据。  视图必须是可更新的

重命名  `DROP VIEW` + `CREATE VIEW`  间接实现重命名。  需先备份视图的创建语句。 

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)