博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mySQL教程 第9章 触发器
阅读量:6247 次
发布时间:2019-06-22

本文共 3101 字,大约阅读时间需要 10 分钟。

第9章 触发器

入的新数据放到new表,删除的数据放到old表。

准备本章学习环境

连接数据库schoolDB,删除表TStudent,TScore和Tsubject中的所有数据。

delete from TStudent;

delete from TScore;

delete from TSubject;

向学生表插入两条记录

insert TStudent (StudentID,Sname,sex,Class)

values ('00001','张作霖','男','JAVA'),

('00002','汤二虎','男','NET')

向课程表插入3条记录

insert into TSubject values

('0001','计算机网络','奠基计算机网络','清华出版社'),

('0002','数据结构','大话数据结构','人邮出版社'),

('0003','JAVA开发','JAVA企业级开发','人邮出版社')

创建插入触发器

1. 练习:创建插入触发器

查看表TStudent中的记录,你发现没有录入时间enterTime,也没有邮箱Email。

select * from TStudent

下面创建触发器,在TStudent表中插入记录时,使用触发器插入录入时间即enterTime和邮箱即Email。

创建触发器

CREATE TRIGGER autoTimeAndEmail

BEFORE INSERT on `TStudent`

FOR EACH ROW

BEGIN

SET NEW.enterTime=NOW();

SET NEW.Email=concat(PINYIN(NEW.sname),'@hotmail.com');

END

插入两条记录测试触发器是否工作。

insert TStudent (StudentID,Sname,sex,Class)

values ('00003','张左相','男','JAVA'),

('00004','张四非','男','NET')

查看新插入的记录,发现已经由触发器插入了用户邮箱和录入时间

select * from TStudent

2. 练习:使用触发器实现数据插入跟踪

使用触发器实现对TStudent表数据插入的跟踪,将跟踪事件记录到一张审计表中review。

一张表不能同时有多个插入触发器

Drop TRIGGER autoTimeAndEmail

创建记录跟踪的审计表

create table review

(

username varchar(20),

act VARCHAR(10),

studentID varchar(10),

sname VARCHAR(10),

actTime TIMESTAMP

)

创建触发器,该触发器向insertReview表中记录

CREATE TRIGGER insertReview BEFORE INSERT on `TStudent`

FOR EACH ROW

BEGIN

insert review values (user(),'insert',NEW.studentID,NEW.sname,NOW());

END

在Tstudent表插入一条记录

INSERT `TStudent` (studentid,sname,sex,class) VALUES ('00005','王严明','男','NET')

查看review表是否记录了

select * from review

可以看到已经记录下那个用户什么时间插入了一条记录

3. 练习:创建update触发器

在TStudent表上创建触发器,在review表中记录更改学生的学号和更改前的姓名。

CREATE TRIGGER updateReview BEFORE UPDATE on `TStudent`

FOR EACH ROW

BEGIN

insert review values (user(),'update',NEW.studentID,old.sname,NOW());

END

查看学号是00005的学生姓名

select * from `TStudent` where studentID='00005'

UPDATE `TStudent` SET sname='冯国彰' where studentID='00005'

查看是否记录

select * from `review`

4. 练习:创建删除触发器

该触发器能够记录TStudent表的删除事件到review表

CREATE TRIGGER deleteReview BEFORE DELETE on `TStudent`

FOR EACH ROW

BEGIN

insert review values (user(),'delete',old.studentID,old.sname,NOW());

END

删除二条记录

delete from `TStudent` where studentID='00002'

select * from review

5. 练习:在触发器中使用异常回滚操作

MySQL的触发器中不支持rollback和 commit,也就是说如果出现异常,没有办法回滚。解决办法是,如果打算回滚更改,人为产生异常。

创建触发器,限定TStudent表sex列只能输入‘男’或‘女’。如果是其他值,取消插入操作。

注意红色部分是故意产生的错误,因为没有定义E001,这样会自动取消插入。

CREATE TRIGGER limitSex BEFORE INSERT on `TStudent`

FOR EACH ROW

BEGIN

declare M_ERRMSG varchar(10);

if NEW.sex='男' or NEW.sex='女' then

set M_ERRMSG='插入成功';

else select E001 INTO M_ERRMSG;

end if;

END

插入记录,其中一条性别是错误的

insert TStudent (StudentID,Sname,sex,Class)

values ('00005','冯国章','男','JAVA'),

('00006','牛万鹏','南','NET')

可以看到插入失败

查看是否插入了两条,可以看到一条也没插入成功。

直插入一条正确的

insert TStudent (StudentID,Sname,sex,Class) values ('00005','冯国章','男','JAVA')

可以看到插入成功

6. 练习:查看创建的触发器

双击表,在Triggers标签下,可以看到表上的触发器

在以下图中也可以看到创建的触发器

7. 练习:查看触发器的定义

8. 练习:使用SHOW TRIGGERS显示触发器;

SHOW TRIGGERS;

9. 练习:查看所有数据定义的触发器

连接到Information_schema数据库,输入以下命令查看所有触发器

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS

10. 练习:删除触发器

删除触发器,触发器名字区分大小写。

drop trigger limitSex

本文转自 onesthan 51CTO博客,原文链接:http://blog.51cto.com/91xueit/1137982,如需转载请自行联系原作者
你可能感兴趣的文章
《21世纪机器人》——DeutchConn第5晶圆厂,装载码头:重启前5小时
查看>>
《中国人工智能学会通讯》——4.28 数据挖掘技术在电子数据取证中的应用
查看>>
【模式识别国家重点实验室】深度学习教你 “以貌取人”
查看>>
搞定全渠道用户体验不是梦,看这家零售巨头怎样做
查看>>
小程序分销商城开发功能
查看>>
数据中心的区块链硬件可能不会解决任何问题
查看>>
中国电信发布低时延光网络白皮书
查看>>
富瑞特装的物联网“情结”
查看>>
从“拖拽”编程开始到一个合格的程序员
查看>>
再破魔力象限 山石网科入选Gartner IDPS MQ
查看>>
从传统归档到云存储归档的演变
查看>>
灯下黑:业务安全成政企行业重大隐患
查看>>
企业级移动市场一股不能忽视的新兴势力“钉钉+”
查看>>
从零学React Native之01创建第一个程序
查看>>
一个前端与后端分离的架构实例
查看>>
数据分析师的职位划分
查看>>
如何洞察大数据的关联性
查看>>
咕咚为何值1.5亿美元?
查看>>
18个你可能不相信是用CSS制作出来的东西
查看>>
Hadoop之父Doug Cutting眼中大数据技术的未来
查看>>