mysql创建必要触发器_MySQL之视图、触发器、事务、存储、函数、流程控制

一、视图

视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可以用这表去做其他操作。视图的作用就是帮助我们解决了重复写相同的sql语句。现在有两个表,class表和student表。

6da0a54711eca4541cc7eda4ce72462f.png

1,创建视图

70d843772b7f86520577673d16ef65ec.png

2,查看视图的结构和数据,方法和我们查看其他表的方法是一样的

ae28ea143a54c1d0b0dc8d496d790aee.png

但其实在我们的电脑硬盘只有视图的结构文件,没有数据文件

d686d5fda2971e3c14388fa6cd52480c.png

3,使用视图,直接把视图当成表使用就行了

aafdc5cb7175b54dde094024bd7c17b2.png

但是注意:如果你对视图进行了修改,相对的表也会进行修改

d0db4099f5781ba5e3fbb7f00d1bdb60.png

4,修改视图,相当于给之前已有的视图赋予新的结构

alter view 视图名称 as sql 语句,这样之前的视图里的结构就没了,换成了新的结构

5,删除视图

drop view 视图名称

二、触发器

在一张表进行增删改操作的前后,触发另一个操作,被称为触发器,被触发的操作是自动执行一段sql语句,触发器无法由用户直接调用的,而是在对表进行增删改的操作时自动调用的。

1,创建触发器

#插入数据前

CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW

BEGIN#begin和end里面写触发器要做的sql事情,注意里面的代码缩进,并且给触发器起名字的时候,名字的格式最好这样写,有表示意义,一看名字就知道要做什么,是给哪个表设置的触发器

...

END#插入数据后

CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW

BEGIN

...

END#删除数据前

CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW

BEGIN

...

END#删除数据后

CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW

BEGIN

...

END#更改数据前

CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW

BEGIN

...

END#更改数据后

CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW

BEGIN

...

END

2,触发器的简单使用

现在已经存在一个student表。

ec7404e1c45bc180e8935e6c90174072.png

我现在在创建一个表t1,我想让每次往student表插入一条数据时,就自动往t1表插入一条学生名字的数据,此时我就可以使用触发器

490de67429ddddd68448906143da66ab.png

#准备表

CREATE TABLE cmd ( #这是一张指令信息表,你在系统里面执行的任何的系统命令都在表里面写一条记录

id INT PRIMARY KEY auto_increment, #id

USER CHAR (32), #用户

priv CHAR (10), #权限

cmd CHAR (64), #指令

sub_time datetime, #提交时间

success enum ('yes', 'no') #是否执行成功,0代表执行失败

);

CREATE TABLE errlog ( #指令执行错误的信息统计表,专门提取上面cmd表的错误记录

id INT PRIMARY KEY auto_increment, #id

err_cmd CHAR (64), #错误指令

err_time datetime #错误命令的提交时间

);

#现在的需求是:不管正确或者错误的cmd,都需要往cmd表里面插入,然后,如果是错误的记录,还需要往errlog表里面插入一条记录

#若果没有触发器,我们会怎么实现,我们完全可以通过咱们的应用程序来做,根据cmd表里面的success这个字段是哪个值(yes成功,no表示失败),在给cmd插入记录的时候,判断一下这个值是yes或者no,来判断一下成功或者失败,如果失败了,直接给errlog来插入一条记录

#但是mysql说,你的应用程序可以省事儿了,你只需要往cmd表里面插入数据就行了,没必要你自己来判断了,可以使用触发器来实现,可以判断你插入的这条记录的success这个字段对应的值,然后自动来触发触发器,进行errlog表的数据插入

#创建触发器

delimiter // (或者写$$,其他符号也行,但是不要写mysql不能认识的,知道一下就行了),delimiter 是告诉mysql,遇到这句话的时候,就将sql语句的结束符分号改成delimiter后面的//

CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW #在你cmd表插入一条记录之后触发的。

BEGIN #每次给cmd插入一条记录的时候,都会被mysql封装成一个对象,叫做NEW,里面的字段都是这个NEW的属性

IF NEW.success = 'no' THEN #mysql里面是可以写这种判断的,等值判断只有一个等号,然后写then

INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必须加分号,并且注意,我们必须用delimiter来包裹,不然,mysql一看到分号,就认为你的sql结束了,所以会报错

END IF ; #然后写end if,必须加分号

END// #只有遇到//这个完成的sql才算结束

delimiter ; #然后将mysql的结束符改回为分号

#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志

INSERT INTO cmd (

USER,

priv,

cmd,

sub_time,

success

)

VALUES

('chao','0755','ls -l /etc',NOW(),'yes'),

('chao','0755','cat /etc/passwd',NOW(),'no'),

('chao','0755','useradd xxx',NOW(),'no'),

('chao','0755','ps aux',NOW(),'yes');

#查询错误日志,发现有两条

mysql> select * from errlog;

+----+-----------------+---------------------+

| id | err_cmd | err_time |

+----+-----------------+---------------------+

| 1 | cat /etc/passwd | 2017-09-14 22:18:48 |

| 2 | useradd xxx | 2017-09-14 22:18:48 |

+----+-----------------+---------------------+

rows in set (0.00 sec)

注意:new表示即将插入的数据行,old表示即将删除的数据行

3,删除触发器

drop trigger 触发器名称

三、事务

InnoDB存储引擎为啥现在用的比较多,有一部分原因在于它支持事务,事务就是有几个操作是有关联的,这几个操作要么同时成功,要么同时失败。比如说我给一妹子转账200元,我的账户要减200,妹子的账户加200,这两个操作就必须同时成功,或者同时失败,不然的话,我的账户减了200,然而妹子的账户没有加200,那么我的钱去哪了,这肯定不行嘛,此时就需要事务来帮我们完成。

create table user(

id int primary key auto_increment,

name char(32),

balance int

);

in

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值