前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL之视图简介

MySQL之视图简介

作者头像
AsiaYe
发布2019-11-06 16:13:27
4480
发布2019-11-06 16:13:27
举报
文章被收录于专栏:DBA随笔DBA随笔
MySQL中的视图
MySQL之视图
在MySQL数据库中,视图view是一个命名的虚表,之所以称之为虚表,是因为它可以当成一个表使用,它是由一个SQL查询来定义,但是却不占用物理存储。

视图在数据库中有着重要的作用,视图经常被用来当做一个抽象的装置,特别是对某些应用来讲,它可能不关心表的结构,只需要按照视图的定义来取特定字段的数据或者更新数据,因此,视图的使用可以在一定程度上保证数据的安全。总体来讲,它的作用可以分为以下三类:

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

需要注意的是,虽然视图是一个虚拟的表,但是用户可以对某些视图进行更新操作,然后传递到基本表,一般称这种可以进行更新操作的视图为可更新视图,也就是updatable view,视图定义中的with check option就是用于可更新的视图的,它用来确认更新的值是否需要检查,为了解释这个参数,我们来看一个例子:

代码语言:javascript
复制
mysql> use test
Database changed
mysql> create table t (id int);
Query OK, 0 rows affected (0.85 sec)

mysql> create view v_t as select * from t where id<10;
Query OK, 0 rows affected (0.24 sec)

mysql> insert into v_t select 20;
Query OK, 1 row affected (0.61 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from v_t;
Empty set (0.00 sec)

上面的例子中,我们创建了一个id<10的视图v_t,但是之后我们向其中插入了id=20的记录,插入的时候没有报错,但是我们发现里面是没有数值的。接着,我们给他加上with check option这个选项,再来看看结果:

代码语言:javascript
复制
mysql> alter view v_t as select * from t where id<10 with check option;
Query OK, 0 rows affected (0.16 sec)

mysql> insert into v_t select 20;
ERROR 1369 (HY000): CHECK OPTION failed 'test.v_t'

这次,当我们重新插入一条大于10的记录的时候,数据库产生了一个错误,拒绝了视图中的数据更新操作。这就是with check option参数的作用。

show tables命令,想必所有的MySQL DBA都不陌生,这个命令会显示数据库下面的所有表,当我们定义了一个视图的时候,同样会把视图显示出来,如同上面的例子中的v_t一样:

代码语言:javascript
复制
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t              |
| v_t            |
| z              |
| zz             |
+----------------+
4 rows in set (0.03 sec)

如果用户不想查看数据库里面的视图,则可以通过information_schema下面的table表来查询,并且给定限定条件base table,这样可以看到真实的基表:

代码语言:javascript
复制
mysql> select * from information_schema.tables where table_type='BASE TABLE' and
 table_schema=database()\G
*************************** 1. row ***************************
  TABLE_CATALOG: def
   TABLE_SCHEMA: test
     TABLE_NAME: t
     TABLE_TYPE: BASE TABLE
         ENGINE: InnoDB
        VERSION: 10
     ROW_FORMAT: Dynamic
     TABLE_ROWS: 1
 AVG_ROW_LENGTH: 16384
    DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
   INDEX_LENGTH: 0
      DATA_FREE: 0
 AUTO_INCREMENT: NULL
    CREATE_TIME: 2018-12-19 23:11:00
    UPDATE_TIME: 2018-12-19 23:11:55
     CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
       CHECKSUM: NULL
 CREATE_OPTIONS:
  TABLE_COMMENT:

如果我们只想查看view,则可以查看information_schema下面的views表,这个表给出了视图的详细信息,包括视图的定义者、视图内容、是否可更新、字符集等,如下:

代码语言:javascript
复制
mysql> select * from information_schema.views where table_schema=database()\G
*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: v_t
     VIEW_DEFINITION: select `test`.`t`.`id` AS `id` from `test`.`t` where (`tes
t`.`t`.`id` < 10)
        CHECK_OPTION: CASCADED
        IS_UPDATABLE: YES
             DEFINER: root@localhost
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
1 row in set (0.14 sec)

我们再来看视图的另外一种特性,基本表数据发生了改变,视图也会跟着改变,一起来看下面的例子,当我们在上述t表中插入相应的数据的时候,来查看v_t视图是否会发生相应的变化:

代码语言:javascript
复制
mysql> insert into t values (10),(9),(8),(7);
Query OK, 4 rows affected (0.11 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from v_t;
+------+
| id   |
+------+
|    9 |
|    8 |
|    7 |
+------+
3 rows in set (0.00 sec)

我们可以看到,当我们给基表t中插入数据的时候,视图中也相应的有了数据。同样的,当我们在一对一的视图中进行删除操作时,如果没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行增删改数据操作的,一对多的情况下,我们不能在一张视图上进行同时修改两张表的操作,具体的例子大家可以去模拟尝试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档