数据库系统概论——触发器例题
注:本人电脑安装的是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_TAFTER UPDATE ON SCFOR EACH ROWIF(New.Grade >= 1.1 * Old.Grade) THENINSERT INTO SC_UVALUES(Old.Sno, Old.Cno, Old.Grade, New.Grade);END IF;
这样就创建好了一个UPDATE触发器,可以输入下面的代码进行查询:
SHOW TRIGGERS;
如下图所示:
我们还可以用一些数据测试一下:
INSERT INTO SCVALUES('123', '456', 50); #在SC表中插入一组数据UPDATE SCSET Grade = 60WHERE Sno = '123'; #将原来的成绩(50分)改为60以达到触发条件
由此,UPDATE触发器设置完毕。
2. INSERT 触发器
例题如下:
首先我们创建一个用于记录的StudentInsertLog表:
CREATE TABLE StudentInsertLog(Numbers int);
接着创建 INSERT 触发器:
CREATE TRIGGER Student_CountAFTER INSERT ON StudentFOR EACH ROWINSERT INTO StudentInsertLog(Numbers)SELECT COUNT(*) FROM Student;
同样可以使用代码:SHOW TRIGGERS; 进行查询已创建的触发器。
再用数据进行测试:
INSERT INTO StudentVALUES('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_SALBEFORE INSERT OR TeacherFOR EACH ROWBEGIN IF(New.Job = '教授') AND (New.Sal < 4000) THEN SET New.Sal = 4000; END IF;END
查询结果如下:
最后再用一组数据测试一下:
INSERT INTO TeacherVALUES(1102, 'Franklin', '教授', 100, 1); #设置薪水为100
启动触发器,将Franklin教授的薪水由 100 改为 4000 :
最后的最后,BEFORE 触发器设置完毕!
本文所写的是IDE中的触发器的书写方式,如果在命令行中敲代码的话会出现报错,尤其是在创建BEFORE触发器的时候。本人在初学数据库时用的是命令行以锻炼对于代码的感知能力和熟悉程度,之后为了更好地搭建数据库便选取了Beekeeper-Studio,市面上还有其他的编辑器可供选择,读者可任取之一。
学习永无止境,与读者共勉。