触发器before和after区别

Posted Shuai#Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发器before和after区别相关的知识,希望对你有一定的参考价值。

触发器before和after区别

创建触发器时,在before和after的选择上,有些区分,下面是一个实例,希望对你有所启发

1、建立一个通信录数据库,要求需要有以下三个表:
lxrenb(联系人表)其字段为(联系人编号、姓名、联系电话、家庭地址),
thjlb(通话记录表)其字段为(通话记录编号、联系人编号、通话开始时间、通知结束时间、通话类别、通话状态),
dxjlb(短信记录表)其字段为(短信记录编号、联系人编号、接发时间、短信内容、短信类别)。
数据库名为:TXLSJK。字段名以及字段数据类型可自拟。
2、在联系人表中插入以下5条记录:
(1,董小姐,123456789,河南洛阳市爱情路521号)
3、在通话记录表中插入以下一条记录:
(1,1,当前系统时间,当前系统时间,语音通话,1)
4、在短信记录表中插入以下一条记录:
(1,1,当前系统时间,你的爱情已到请速来领取,1)
5、在联系人表上建立一个触发器,当删除联系人时,删除该联系人的通话记录和短信记录

#首先建好数据库和表,记得表之间要有外键约束

CREATE DATABASE TXLSJK DEFAULT CHARACTER SET ='utf8';

DROP TABLE IF EXISTS lxrenb;
CREATE TABLE lxrenb(
lid INT(10) AUTO_INCREMENT PRIMARY KEY,
lname VARCHAR(20),
lnum VARCHAR(20),
laddress VARCHAR(20)
);

DROP TABLE IF EXISTS thjlb;
CREATE TABLE thjlb(
tid INT(10) AUTO_INCREMENT,
tlid INT(10),
tbegin DATETIME,
tend DATETIME,
tcategory VARCHAR(20),
tstate VARCHAR(20),
PRIMARY KEY(tid),
FOREIGN KEY (tlid) REFERENCES lxrenb(lid)
);

DROP TABLE IF EXISTS dxjlb;
CREATE TABLE dxjlb(
did INT(10) AUTO_INCREMENT PRIMARY KEY,
dlid INT(10),
dtime DATE,
dtext VARCHAR(20),
dcategory VARCHAR(20),
FOREIGN KEY (dlid) REFERENCES lxrenb(lid)
);

#插入各表数据

INSERT INTO lxrenb VALUES(1,'董小姐','123456789','河南洛阳市爱情路521号');
INSERT INTO thjlb VALUES(1,1,NOW(),NOW(),'语音通话','1');
INSERT INTO dxjlb VALUES(1,1,CURDATE(),'你的爱情已到请速来领取','1');



#如果选用after创建触发器

DROP TRIGGER IF EXISTS dropinformation;
DELIMITER $$
CREATE TRIGGER dropinformation
AFTER DELETE ON lxrenb
FOR EACH ROW
BEGIN
	DELETE FROM thjlb WHERE tlid=old.lid;
	DELETE FROM dxjlb WHERE dlid=old.lid;
END $$
DELIMITER ;

#测试,删除联系人董小姐

DELETE FROM lxrenb WHERE lid=1;

#会报错误

这个错误是因为:通信记录表短信记录表里面有外键约束,即:想要从联系人表里面删除联系人董小姐,必须先删除通信记录表短信记录表里面有关董小姐的信息,所以在删除联系人之前,必须先删除通信记录表短信记录表里面的信息,所以要用before

#选用before,创建触发器

DROP TRIGGER IF EXISTS dropinformation;
DELIMITER $$
CREATE TRIGGER dropinformation
BEFORE DELETE ON lxrenb
FOR EACH ROW
BEGIN
	DELETE FROM thjlb WHERE tlid=old.lid;
	DELETE FROM dxjlb WHERE dlid=old.lid;
END $$
DELIMITER ;

#测试,删除联系人董小姐

DELETE FROM lxrenb WHERE lid=1;




#所有表中有关董小姐的信息都被删除


以上便是用一个示例展示了创建触发器时,选用before与after的区别。
一般来说,创建触发器时,用before比after更常见些。

以上是关于触发器before和after区别的主要内容,如果未能解决你的问题,请参考以下文章

触发器before和after区别

触发器before和after区别

触发器before和after区别

mysql触发器Before和After的区别

mysql之触发器before和after的区别

Orcale触发器的after/before