目录
一、触发器是什么?
是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行(简单的说就是:你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句)。触发器经常用于加强数据的完整性约束和业务规则等。
主要作用是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。它能够对数据库中的相关表进行级联修改,强制比CHECK约束更复杂的数据完整性,并自定义操作消息,维护非规范化数据以及比较数据修改前后的状态。与CHECK约束不同,触发器可以引用其它表中的列。在下列情况下使用触发器实现复杂的引用完整性;强制数据间的完整性。创建多行触发器,当插入,更新、删除多行数据时,必须编写一个处理多行数据的触发器。执行级联更新或级联删除这样的动作。级联修改数据库中所有相关表。撤销或者回滚违反引用完整性的操作,防止非法修改数据。
说了触发器,那什么是存储过程呢?
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
触发器与存储过程的区别又是什么呢?
触发器与存储过程的主要区别在于它们的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。
想知道存储过程与函数的区别吗?欢迎来戳->存储过程与函数的区别
二、触发器的基本语法
1. 创建触发器
drop trigger if exists databaseName.tri_Name;
create trigger tri_Name -- tri_Name代表触发器名称
tirgger_time trigger_event on tableName -- tirgger_time为触发时机,可选值有after/before,trigger_event为触发事件,可选值有insert/update/delete
for each row -- 这句话在mysql是固定的,表示任何一条记录上的操作满足触发事件都会触发该触发器。
begin
sql语句;
end
2. 具体示例
INSERT类型触发器
DROP TRIGGER `insert_tri`;
CREATE DEFINER=`root`@`localhost` TRIGGER `insert_tri` BEFORE INSERT ON `pgz_demo`
FOR EACH ROW BEGIN
SET NEW.PASSWORD = '123456'; -- NEW用来表示将要(before)或已经(after)插入的新数据。
END;
--该触发器的意思是:对表pgz_demo进行插入操作时,在执行插入之前把这条数据的PASSWORD字段值置为'123456'
DELETE类型触发器
CREATE TRIGGER `delete_tri` AFTER DELETE ON `pgz_demo`
FOR EACH ROW
BEGIN
DELETE FROM pgz_test WHERE id = old.usid; -- old用来表示将要或已经被删除的原数据。
END
--该触发器的意思是:对表`pgz_demo`进行删除操作时,在执行删除之后同时删除表`pgz_test`中字段id的值与`pgz_demo`表中删除数据的usid相同的数据
UPDATE类型触发器
CREATE TRIGGER update_tri BEFORE UPDATE ON pgz_demo FOR EACH ROW
BEGIN
SET new.version = old.version + 1; -- old用来表示将要或已经被修改的原数据,new用来表示将要或已经修改为的新数据
END
查看触发器
show triggers from databaseName;
删除触发器
drop trigger if exists databaseName.tri_Name;
三、异常场景
注意事项:
-
在触发器后不允许更新新行
-
在对一个表中添加INSERT事件的触发器中不能添加往当前表中新增数据的操作
-
对于一个表,具有相同操作时间和事件的多个触发器(即:同一个表中不能有相同的触发时机和触发事件的触发器)
错误示范:
1.在触发器后不允许更新新行
CREATE TRIGGER `test_update_update` AFTER UPDATE ON `pgz_test` FOR EACH ROW
BEGIN
SET new.pid = 1; --在触发器后不允许跟新新行
END
2.在对一个表中添加INSERT事件的触发器中不能添加往当前表中新增数据的操作
CREATE TRIGGER `test_add_add` BEFORE INSERT ON `pgz_test`
FOR EACH ROW
BEGIN
INSERT INTO pgz_test VALUES(1, 2); --INSERT事件的触发器进行了本表插入操作。
END