首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL-视图

MySQL-视图

作者头像
小陈又菜
发布于 2025-12-23 16:04:26
发布于 2025-12-23 16:04:26
4420
举报

介绍

视图是一种虚拟的表,在数据库中并不真实存在。更简单地说,就是视图并不储存数据,只是纪录了数据的逻辑。

基本操作语法

创建视图

代码语言:javascript
复制
create or replace view name_gen as select user_name,user_gender from users where user_id <=10;

查看视图创建语句

代码语言:javascript
复制
show create view name_gen;

查看视图数据

代码语言:javascript
复制
select *from name_gen;

修改视图

代码语言:javascript
复制
create or replace view name_gen as select user_name,user_gender,uesr_num from users where user_id <=10;
代码语言:javascript
复制
alter view name_gen as select id,name from user where id<=10;

可以添加新的字段,或删除字段。

删除视图

代码语言:javascript
复制
drop view if exist name_gen;

不难发现,视图是一种特殊的表,所以可以想使用表一样来操作视图。

检查选项

我们开始说过,视图当中是不存数据的,试图展示的只是数据间的逻辑关系。

那么大家思考一下,如果我想对表一样,针对视图进行插入操作,还会不会有数据的变化呢?

答案是会变化的,但是变化的本质不是视图,而是视图表示的那张真实存在的数据表,我们将其称为基表。

简单来说,针对视图进行的插入操作,最后会直接作用于基表,此时不管进行表的查询还是视图的查询都会发现数据的修改。

那么对使视图的插入操作会影响到数据表,就会带来一系列的问题,比如:

我创建了一个有十条数据的视图(字段为id和name),,假设基表有5条数据:

代码语言:javascript
复制
create or replace view id_name as select user_id,user_name from users where user_id <=10;

然后针对视图进行插入数据的操作:

代码语言:javascript
复制
insert into name_gen values(8,"小昭");

此时我们知道,基表已经多了一条数据,而我们再进行视图或者基表的查询时,能够看见数据的变化。

那么再次插入一条数据:

代码语言:javascript
复制
insert into name_gen values(12,"光头强");

我们先查看基表,数据变确实变化了。但是我们进行视图视图查询时,发现视图并没有变化!!!

我们回顾一下视图的创建语句,我们使用了约束函数where,约束了id的范围,这就一定程度破坏数据的一致性。

而解决这个问题可以在视图创建时加上检查选项:

代码语言:javascript
复制
create or replace view id_name as select user_id,user_name from users where user_id <=10
with cascaded check option;
--with local check option

介绍

在使用 with local check option 时,MySQL会检查视图的每一个正在更新的行,并确保它符合视图的创建条件。MySQL允许基于一个视图创建另一个视图,为了规定检查的范围,mysql提供了两个选项:

  • with cascaded check option

cascaded就是,当某一个视图是建立在另一个视图上创建的,就会对该视图以及所关联的视图进行检查,必须要都满足,才能进行合法操作。

这里要非常注意的是,虽然即使在创建视图时使用了约束函数where,但是如果没有指定检查选项时,在更新视图时不会去判断where中的条件。

  • with local check option

与cascaded的区别在于,local只会为当前语句创建检查选项,并不会为关联的表创建检查选项。

更新及作用

更新的条件

视图中的行必须与基础表中的行一一对应关系。

视图包含下面任何一项则不可更新:

  1. 聚合函数
  2. DISTINCT
  3. group by
  4. having
  5. UNION、UNION ALL

更新的作用

  • 简单

视图可以简化数据的操作,如果一项查询被经常使用,就可以将其写成视图,就不用每次查询的时候都去指定一系列条件。

  • 安全

虽然数据库可以进行授权操作,但是并不能具体到数据表的行和列上。而通过视图,用户只能修改视图中的可见数据。

  • 数据独立

能够消除底层基表变化带来的影响(用户不需要关心视图背后的实际数据来源)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 基本操作语法
    • 创建视图
    • 查看视图创建语句
    • 查看视图数据
    • 修改视图
    • 删除视图
  • 检查选项
  • 更新及作用
    • 更新的条件
    • 更新的作用
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档