数据库系统概论——触发器例题

注:本人电脑安装的是MySQL5.7,还有一个编辑器Beekeeper-Studio。网络上其他平台或文章有相应的安装教程,都比较简单,在此不做赘述。

1. UPDATE 触发器

读完题目之后,我们开始创建数据库:

CREATE DATABASE FIRSTTRY;

接着在数据库FIRSTTRY中创建三个表 SC, Student, SC_U:

CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno, Cno)
);

CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN('男', '女')),
Sage SMALLINT,
Sdept CHAR(20)
);

CREATE TABLE SC_U
(Sno CHAR(9) PRIMARY KEY,
Cno CHAR(4),
OldGrade SMALLINT,
NewGrade SMALLINT
);

然后我们在已创建的SC表上创建触发器SC_T:

CREATE TRIGGER SC_T
AFTER UPDATE ON SC
FOR EACH ROW
IF(New.Grade >= 1.1 * Old.Grade) THEN
INSERT INTO SC_U
VALUES(Old.Sno, Old.Cno, Old.Grade, New.Grade);
END IF;

这样就创建好了一个UPDATE触发器,可以输入下面的代码进行查询:

SHOW TRIGGERS;

如下图所示:

我们还可以用一些数据测试一下:

INSERT INTO SC
VALUES('123', '456', 50); #在SC表中插入一组数据

UPDATE SC
SET Grade = 60
WHERE Sno = '123'; #将原来的成绩(50分)改为60以达到触发条件

由此,UPDATE触发器设置完毕。 

2. INSERT 触发器

例题如下:

首先我们创建一个用于记录的StudentInsertLog表:

CREATE TABLE StudentInsertLog
(Numbers int
);

接着创建 INSERT 触发器:

CREATE TRIGGER Student_Count
AFTER INSERT ON Student
FOR EACH ROW
INSERT INTO StudentInsertLog(Numbers)
SELECT COUNT(*) FROM Student;

同样可以使用代码:SHOW TRIGGERS; 进行查询已创建的触发器。

再用数据进行测试:

INSERT INTO Student
VALUES('ABC', 'DEF', 'MA', 20, 'DS');

 在StudentInsertLog表中会有如下记录:

因此,INSERT 触发器设置完毕。

3. BEFORE 触发器

例题如下:

 我们首先创建一个Teacher表:

CREATE TABLE Teacher
(Eno NUMERIC(4) PRIMARY KEY,
Ename CHAR(10),
Job CHAR(8),
Sal NUMERIC(7, 2),
Deptno NUMERIC(2)
);

 然后创建 BEFORE 触发器:

CREATE TRIGGER INSERT_OR_UPDATE_SAL
BEFORE INSERT OR Teacher
FOR EACH ROW
BEGIN
    IF(New.Job = '教授') AND (New.Sal < 4000)
    THEN
    SET New.Sal = 4000;
    END IF;
END

查询结果如下:

 最后再用一组数据测试一下:

INSERT INTO Teacher
VALUES(1102, 'Franklin', '教授', 100, 1); #设置薪水为100

启动触发器,将Franklin教授的薪水由 100 改为 4000 :

最后的最后,BEFORE 触发器设置完毕!

本文所写的是IDE中的触发器的书写方式,如果在命令行中敲代码的话会出现报错,尤其是在创建BEFORE触发器的时候。本人在初学数据库时用的是命令行以锻炼对于代码的感知能力和熟悉程度,之后为了更好地搭建数据库便选取了Beekeeper-Studio,市面上还有其他的编辑器可供选择,读者可任取之一。

学习永无止境,与读者共勉。

  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值