数据库(MySQL)基础]MySQL中的视图、存储过程和触发器 - 1. 视图
视图是虚拟存在的表,通过实际的数据库表来生成面向不同用户和不同角色的视图(不同角色所需内容不一样)
1.1 视图创建
Create [or replace] View 视图名称 As (Select语句) [WITH [CASCADED|LOCAL] CHECK OPTION]
其中replace
表示替换视图,感觉应该就是更新视图的意思?
1.2 视图查询
查询创建视图语句:show create view 视图名称
,查出来的雨具包括原始创建视图语句中没有写的一些默认参数
查看视图数据:select * from 视图名称
(类似于查询表一样的操作)
1.3 视图修改
方式一:修改视图可以用创建视图的语句,但是重点主要在于Replace
,把视图内容替换掉,Create or Replace View 视图名称 As (Select语句)
方式二:Alter View 视图名称 As (Select)语句
1.4 视图删除
Drop View [If Exists] 视图名称
1.5 视图检查选项
使用WITH CHECK OPTION自居创建视图时,MySQL会通过视图检查正在更改的每个行,如插入,更新,删除,使其符合视图定义。MySQL允许基于另一个视图创建视图,还会检查依赖视图中的规则以保持一致性。
1.5.1 cascaded检查选项
Cascaded选项表明操作是否满足当前视图约束及当前视图所依赖视图的约束(父视图,递归检查所有的父视图),并不检查它的子视图(依赖于它的视图)
如果子视图自身没有约束,也会向上检查父视图,只要有父视图存在约束就不断向上检查
1.5.1.1 这个选项存在为了避免什么问题?
假设我们建立视图的语句为:create or replace view stu_v_1 as select id, name from student where id <= 20
那么我们可以通过select * from stu_v_1
来查询视图中的内容
如果我们向视图中插入数据insert into stu_v_1 values(6,'Tom')
、insert into stu_v_1 values(30,'Tom')
,因为视图实际上不是存储数据的载体,表实际上才是存储数据的载体,所以这里向视图插入的数据会存储到实际的表中去
再次通过select * from stu_v_1
来查询视图,发现无法查到id=30
的那条数据,但实际上,我们是希望语句能够“插入”到视图中去的,也就是通过视图查询语句,我们可以查到id=30
的数据
1.5.1.2 怎么利用这个选项
建立视图的语句修改成create or replace view stu_v_1 as select id, name from student where id <= 20 with cascaded check option
这时候执行insert into stu_v_1 values(30,'Tom')
会报错:CHECK OPTION failed ‘…’
1.5.1.3 子视图
假如创建视图stu_v_1
的语句是:create or replace view stu_v_1 as select id, name from student where id <= 20
创建了一个源自stu_v_1
的语句stu_v_2
:create or replace view stu_v_2 as select id, name from stu_v_1 where id >= 10 with cascaded check option
下列插入语句:
-
insert into stu_v_2 values(7,'Tom')
-
insert into stu_v_2 values(26,'Tom')
-
insert into stu_v_2 values(15,'Tom')
的执行,是成功还是失败?
语句1,id=7的会执行失败,因为其不满足id>=10
的约束
语句2,id=26的会执行失败,因为其不满足父视图id<=20
的约束
语句3,id=15同时满足>=10&&<=20,执行成功
假如再创建一个源自stu_v_2
的视图stu_v_3
:create or replace view stu_v_3 as select id, name from stu_v_2 where id <= 15
下列插入语句:
-
insert into stu_v_3 values(11, 'Tom')
-
insert into stu_v_3 values(17, 'Tom')
-
insert into stu_v_3 values(28, 'Tom')
的执行,是成功还是失败?
语句1,id=11的会执行成功,向上检查stu_v_2
和stu_v_1
的约束,分别是>=20
和<=20
语句2,id=17的会执行成功,因为stu_v_3
没有加wiith cascaded check option
,所以不会检查其自身的约束,而是向上检查2和1两个视图的约束,满足,则可以执行成功
语句3,id=28的会执行失败,因为不满足stu_v_1
的约束。
1.5.2 local检查选项
若本级添加了with local check option
,检查操作是否满足当前这一条的约束,向上递归检查所有父亲视图(包括父视图、父视图的父视图…),若父亲视图有with cascaded/local check option
则根据父亲视图条件进行校验,若没有则不校验(基于MySQL 8.0)
1.5.2.1 local示例
视图1:create view stu_v_1 as select id, name from student where id <= 15
视图2:create view stu_v_2 as select id, name from stu_v_1 where id >= 10 with local check option
视图3:create view stu_v_3 as select id, name from stu_v_2 where id < 20
下列插入语句:
-
insert into stu_v_1 values(5, 'Tom')
-
insert into stu_v_1 values(16, 'Tom')
-
insert into stu_v_2 values(13, 'Tom')
-
insert into stu_v_2 values(17, 'Tom')
-
insert into stu_v_3 values(14, 'Tom')
的执行,是成功还是失败?
语句1、2:执行成功,因为没有加入检查选项
语句3、4:执行成功,满足stu_v_2
的条件,去找stu_v_1
发现它没有加检查选项,所以不需要根据stu_v_1
表的条件判断
语句5:执行成功,stu_v_3
视图没有加入约束,所以不检查当前视图的条件;向上去找父亲视图stu_v_2
的条件,发现有local
的约束,则检查,满足约束;再向上找父亲视图stu_v_1
,发现没有加检查约束,则不检查。说明满足约束,执行成功。
1.6 视图更新及作用
并不是所有的视图都可以更新,那么要考虑的是符合什么条件的的视图可以更新?
要使视图可更新,则视图中的行与基础表中的行之间必须存在一对一关系。如果视图包含以下任何一项,则该视图不可更新:
-
聚合函数或窗口函数(
SUM,MIN,MAX,COUNT
等); -
DISTINCT
-
GROUP BY
-
HAVING
-
UNION或者UNION ALL
如create view stu_v_count as select count(*) from student
创建的视图不可以更新
视图的作用:
-
简单:简化用户对数据的理解,简化他们的操作。经常被使用的查询可以被定义为视图,从而使得用户不必为以后得操作每次指定全部的条件。
-
安全:数据库可以授权,但不能授权到数据库特定行和特定列上。通过视图用户只能查询和修改他们所能见到的数据(如学生表有学生号、学生名、班级名,可以通过视图隐藏不想让用户看到的班级名,避免用户对班级名的操作)
-
数据独立:视图可以帮助用户屏蔽真实表结构变化带来的影响(如学生表中的学生名属性要rename成名属性,可以通过select 名 as 学生名,使得用户看到属性的名称仍为学生名,表结构的变化不会对用户造成影响)
上一篇: 您是初学者还是成熟女性?
下一篇: 25 岁后女孩的 15 条基本穿衣准则
推荐阅读
-
什么是数据库事物?为什么需要数据库事物,事物有哪些特征?事物的隔离级别是什么?-1.什么是数据库事务? 1.事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须具备四个属性,即ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为事务: 原子性 2.事务必须是一个原子工作单元;它的数据修改要么全部执行,要么全部不执行。 一致性 3.事务完成时,所有数据必须保持一致。在相关数据库中,所有规则都必须适用于事务的修改,以保持所有数据的完整性。事务结束时,所有内部数据结构(如 B 树索引或双向链接表)必须正确无误。 隔离 4.并发事务的修改必须与其他并发事务的修改隔离。一个事务会在另一个并发事务修改之前或之后查看某一状态下的数据,而不会查看中间状态下的数据。这就是所谓的可序列化,因为它允许重新加载起始数据和重放一系列事务,从而使数据最终处于与原始事务执行时相同的状态。 持久性 5.事务完成后,它对系统的影响是永久性的。即使在系统发生故障的情况下,修改也会保留。 2. 为什么需要数据库事物,事物有哪些特征? 事物对数据库的作用是对数据进行一系列操作,要么全部成功,要么全部失败,防止出现中间状态,确保数据库中的数据始终处于正确、和谐的状态。 特征:原子性、一致性、隔离性、持久性,以及其他特征 原子性(Atomicity):所有操作在事务开始后,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出现错误时,会回滚到事务开始前的状态,所有操作就像没有发生一样。也就是说,事务是一个不可分割的整体,就像化学中的原子一样,是物质的基本单位。 一致性(Consistency):在事务开始之前和结束之后,数据库的完整性约束都没有被破坏。例如,如果 A 转钱给 B,A 不可能扣除这笔钱,但 B 却没有收到这笔钱。 隔离:在同一时间内,只允许一个事务请求相同的数据,不同事务之间没有干扰。例如,甲正在从一张银行卡上取款,在甲取款过程结束之前,乙不能向这张卡转账。 持久性(耐用性):事务完成后,事务对数据库的所有更新都将保存到数据库中,无法回滚 3.事务的隔离级别有哪些? 数据库事务有四种隔离级别,从低到高分别是未提交读取(Read uncommitted)、已提交读取(Read committed)、可重复读取(Repeatable read)、可序列化(Serializable)。此外,事务的并发操作中可能会出现脏读、不可重复读、幽灵读等情况。事务并发问题 脏读:事务 A 读取事务 B 更新的数据,然后事务 B 回滚操作,那么事务 A 读取的数据就是脏数据。 不可重复读取:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取期间更新并提交数据,导致事务 A 多次读取同一数据时结果不一致。 幻影读取:系统管理员 A 将数据库中所有学生的具体分数改为 ABCDE 等级,但系统管理员 B 在此时插入了具体分数的记录,当系统管理员 A 更改结束后发现仍有一条记录未被更改,仿佛发生了幻觉,这称为幻影读取。 小结:不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于增删。解决不可重复读问题只需锁定满足条件的行,解决幻读问题则需要锁定表 MySQL 事务隔离级别
-
数据库(MySQL)基础]MySQL中的视图、存储过程和触发器 - 1. 视图
-
简易获取SQL Server数据库中的数据、表格(包括字段、索引等)以及视图和存储过程的相关信息脚本
-
南邮OJ Web任务大揭秘:层层挑战剖析 1. 挑战一:迷宫般的目录探索 题目作者似乎穷举了所有可能的目录组合,最终在404.php中的