Mysql 视图&事务&触发器

参考资料

一、视图

视图的含义:

视图是一个虚拟表,是从数据库中一个或者多个表中导出来的表。

1、创建视图

#语法:CREATE VIEW 视图名称 AS  SQL语句
create view teacher_view as select tid from teacher where tname='李平老师';

#于是查询李平老师教授的课程名的sql可以改写为
mysql> select cname from course where teacher_id = (select tid from teacher_view);
+--------+
| cname  |
+--------+
| 物理   |
| 美术   |
+--------+
rows in set (0.00 sec)

#!!!注意注意注意:
#1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高

#2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,
那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,
你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便

2、查看视图

select * from course_view;

create view view_sc as select * from sc;
select * from view_sc;
desc view_sc;
show create view view_sc;

 3、修改视图

修改视图:
语法:ALTER VIEW 视图名称 AS SQL语句
ALTER alter view view_sc as select * from student; select * from view_sc;

查看数据库中原有的视图

select * from information_schema.views; 

4、更新视图

更新视图是指通过插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。
通过视图更新的时候都是转到基本表进行更新的,
如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录

建立视图一般是为了查看,不建议更新操作

5、删除视图

语法:DROP VIEW 视图名称

DROP VIEW teacher_view

 二、事务

1、定义

事务就是将一组SQL语句放在同一批次内去执行
如果一个SQL语句出错,则该批次内的所有SQL都将被执行

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。                      
   
一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性

 2、事务的ACID原则

ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:
原子性(Atomicity)、最小单元,保证一个操作作为一个过程去处理

一致性(Consistency)、如果其中有任何步骤失败,整个过程回滚(回到原始状态)

隔离性(Isolation)、事物之间互不影响,相互独立

持久性(Durability),事务提交成功后,会永久的存储,状态不会再改变
一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。 使用场景: 银行的交易系统 eg: start transaction; update user set balance
= 900 where name = 'wsb'; #买支付100元 update user set balance = 1010 where name = 'egon'; #中介拿走10元 uppdate user set balance = 1090 where name = 'ysb'; #卖家拿到90元,出现异常没有拿到 rollback; commit;

3、MYSQL事务实现的方法

(1)set autocommit

使用set语句来改变自动提交模式

SET AUTOCOMMIT  = 0;    # 关闭自动提交模式

SET AUTOCOMMIT  = 1;    # 开启自动提交模式
MySQL中默认是自动提交
使用事务时应先关闭自动提交
1 查看提交模式
select @@autocommit;


2 关闭自动提交模式
set autocommit=0;


案例分析:

顾客A在线购买一款商品,价格为500.00元,采用网上银
    行转账的方式支付
假如顾客A银行卡的余额为2000.00元,且向卖家B支付购
    买商品费用500.00元,起始卖家B的账号金额10000.00元
创建数据库shop和创建表account并插入2条数据
创建表 shop表
create table shop(
name VARCHAR(32) not null,
cash int(4)
);

插入数据:
insert into shop VALUES('A',2000),('B',10000)

插入数据不成功,因为上一步把自动提交关闭了

set autocommit=1;
insert into shop VALUES('A',2000),('B',10000)

关闭自动提交模式
set autocommit=0;

 4、事务的语法

关闭自动提交模式
set autocommit=0;
start transaction;
update shop set cash=cash-500 where name='A';
update shop set cash=cash+500 where name='B';
select * from shop;

没有提交,只是显示操作后的状态,但实际数据依旧没变
ROLLBACK; 没有commit回滚回到原来的状态
commit; 先提交再回滚,也不会回到最初的状态,而是出现提交后的状态


最后还原自动提交模式
set autocommit=1;

三、触发器

 trigger 英 /'trɪgə/ 美 /'trɪɡɚ/   vt 触发、引发

使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

1、定义

在某种操作执行的同时触发另一种操作。它的执行不是由程序调用,也不是手工启动,而是由事件来触发,
比如当对一个表进行操作( insert,delete, update)时就会激活它执行。

2、触发器的语法

3、案例分析

student表 每插入一条数据,计数表就计数
由于没有计数表,先创建
create table account(
stu_count int(4),
change_time datetime
);

触发器
create trigger tir_stu
after 
insert 
on student 
for each row 
begin
update account set stu_count=stu_count+1,change_time=now();
end;

先运行触发器,创建触发器

select * from account;

在执行插入之前必须要数据
INSERT into account VALUES((select count(*) from student),NOW());

student表插入数据
INSERT into student VALUES(1014,'cc',12,1);

 4、触发器的删除

drop trigger 触发器名

 

MySQL触发器是在5.0版本引入的。针对需要对数据库做级联更改是很适宜使用的,如需要实时监控某张表中的某个字段的更改而需要做出相应的处理。

触发器虽然功能强大,能轻松可靠的实现许多复杂的功能不过,要慎用触发器,滥用触发器会造成数据库以及应用程序维护困难。
原文地址:https://www.cnblogs.com/foremostxl/p/11409499.html