11.视图-触发器-事务

1.视图

视图:通过查询得到一张虚拟表然后保存下来,可以下次使用,制作视图的也是表。
如果要频繁的操作一张虚拟表,就可以制作视图,后续操作视图。
1.1制作视图
create view 视图名  as (虚拟表的查询sql语句);

返回结果 OK 
# 1.拼接虚拟表 
select * from course inner join teacher on course.teacher_id = teacher.tid;

# 创建临时表
create view t1 as select * from course inner join teacher on course.teacher_id = teacher.tid;

# 查看视图
select * from t2;
1.2注意点
1.创建的视图在硬盘上只会有表结构,没有数据,数据还是需要之前的表。
2.视图通常只是用来查询里面的数据,不要进行修改可能会影响真正的表。
3.视图的属于频率不高,创建一个视图就生产一张表,数据库中表太多了不方便维护。

2.触发器

在满足对表数据进行增删改的情况下自动触发的功能。
使用触发器可以实现监、日志、自动处理异常等等。
触发器可以在6种情况下自动触发。

增前/增后 before insert / after insert
删前/删后 before update / after update
改前/改后 before dalete / after dalete
2.1创建触发器
语法:
create terigger 触发器名称 before/after  insert/update/dalete  on 表名字
for each row begin  # 每行开始干什么
	sql语句;
end;
注意点:
1. 触发器的名称 见名知意。
2. sql语句和end 需要加上结束符号,需要对默认结束符进行修改。
2.2删除触发器
drop trigger 触发器名称;

3.修改默认结束符

默认是结束符为分号;
delimiter xx符号 
设置xx符号为结束符只作用于当前窗口临时有效。
delimiter $$  # 将默认的结束符号;改为$$
delimiter ; # 改回来

select  * from tenchar;  # 没用
select  * from tenchar$$  # 可以

4.触发器案例

要求:在cmd表中的记录succer字段是no那么就触发 触发器的执行去errlog表中插入数据。
create table cmd(
	id int primary key auto_increment,
	user char(32),  # 用户
	cmd char(64),  # 输入的命令
	sub_time datetime,  # 提交时间
	success enum('yes','no')  # 任务执情况结果
);
create table errlog(
	id int primary key auto_increment,
	err_cmd char(64),  # 错误的命令
	err_time datetime   # 执行错误命令的时间
    # 从上一张表cmd获取数据
);
在写这个触发器线将默认结束符号修改。
delimiter $$ 
create trigger bad_cmd after insert on cmd
for each row begin
	if NEW.success = 'no' then  # NEW 指代的就是一条条数据对象
		# 传入参数
		insert into errlog(err_cmd, err_time)  
values (NEW.cmd, NEW.sub_time);
	end if;
end $$
delimiter ; 
delimiter ; # 一定要有空格不要写成delimiter; 
 if  条件  then 执行的语句
 当if条件满足,执行then后面的sql语句
insert  into cmd(user,cmd,sub_time,success)
values 
('kid0',  'ls -l /x0', NOW(), 'yes'),  # 执行成功
('kid1',  'ls -l /x1', NOW(), 'no'),
('kid2',  'ls -l /x2', NOW(), 'no'),
('kid3',  'ls -l /x3', NOW(), 'yes');  # 执行成功
 select * from errlog;
 select * from errlog;
+----+-----------+---------------------+
| id | err_cmd   | err_time            |
+----+-----------+---------------------+
|  1 | ls -l /x1 | 2021-08-01 14:02:37 |
|  2 | ls -l /x2 | 2021-08-01 14:02:37 |
+----+-----------+---------------------+

5.事务

5.1四大特性
事务的四大特性:(ACID)
A.原子性:一个事务是一个不可分割的单位,事务中包好的诸多操作要么同时成功要么同时失败。
B.一致性:事务必须是使数据从一个一致性的状态变到另一个一致性的状态。
一致性跟原子性是密切相关的。

I.隔离性:一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用到的数据对并发的其他事务是隔离的,并发的事务之间也是互相比干扰的。

D.持久性:也叫永久性,一个事务一旦提交成功,那么对数据库在家哦你的数据修改是永远的接下来的其他操作或者或者故障不应该对其他有任何的影响。
5.1原子性作用
开启一个实物可以包含多条sql语句,这些sql语句要么同时成功,要么一个别想成功。
例子:
银行转账  A --> B 100元。
1.A银行卡数据-100
2.B银行卡数据+100
在A转账时,数据-100,正好软件故障,B银行卡数据没有+100

在操作多条数据的时候可能会出现某几条不成功的情况。将这几天数据放进一个事务内,要么都成功,要门都不成功。保证数据的一致性保证安全。
5.2事务的关键字
事务的关键字
1.开启事务 
start transaction;

2.回滚: 回到事务执行之前的状态。
rollback;

3.二次确认(确认之后,无法回滚)
commit;
5.3模拟转账功能
想让多条sql语句保持一致性要么同时成功,要么同时失败就需要考虑使用事务。
1.用户表
create table user(
id int primary key auto_increment,
name varchar(16),
balance int
);
2.插入数据
insert into user(name, balance) 
values ('kid', 1000) ,('qz', 1000),('qq', 100);
3.查看数据
select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | kid  |    1000 |
|  2 | qz   |    1000 |
|  3 | qq   |    1000 |
+----+------+---------+
4.开启事务
# 开启事务
start transaction;
5.修改数据
# 修改多条sql语句
update user set balance = 900 where name = 'kid';
update user set balance = 1090 where name = 'qz';
update user set balance = 1010 where name = 'qq';
6.查看数据
select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | kid  |     900 |
|  2 | qz   |    1090 |
|  3 | qq   |    1010 |
+----+------+---------+
7.回滚操作
数据此时在内存,还没有写入硬盘中。
rollback;
# Query OK, 0 rows affected (0.00 sec)
8. 查看数据
mysql> select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | kid  |    1000 |
|  2 | qz   |    1000 |
|  3 | qq   |    1000 |
9.再次修改数据
# 修改多条sql语句
update user set balance = 900 where name = 'kid';
update user set balance = 1090 where name = 'qz';
update user set balance = 1010 where name = 'qq';
10.查看数据
select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | kid  |     900 |
|  2 | qz   |    1090 |
|  3 | qq   |    1010 |
+----+------+---------+
11.二次确认
commit;
12.回滚操作
rollback;
# Query OK, 0 rows affected (0.00 sec) 二次确认之后无法回滚到之前的数据
13.查看数据
select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
|  1 | kid  |     900 |
|  2 | qz   |    1090 |
|  3 | qq   |    1010 |
+----+------+---------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值