在MySQL中,触发器可以在你执行INSERT、UPDATE或DELETE的时候,执行一些特定的操作。
语法
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tb_name
FOR EACH ROW
BEGIN
trigger_body
END
参数含义:
trigger_name:自定义触发器名称;
trigger_time:触发时机,取值为 BEFORE 或 AFTER;
trigger_event:触发事件,取值为 INSERT、UPDATE 或 DELETE;
tb_name:在哪张表上建立触发器;
trigger_body:触发器程序体。
new 与 old
在 INSERT 型触发器中,new用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,old用来表示将要或已经被修改的原数据,new用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,old用来表示将要或已经被删除的原数据;
变量定义
MySQL 中使用 DECLARE 来定义一局部变量,该变量只能在 BEGIN … END 复合语句中使用。
语法:DECLARE 变量名+类型。
DECLARE v_name VARCHAR(20);
分隔符
MySQL默认以";“为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个”//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。
实例
- 实例的表结构:
学生表:user
学生删除记录表:user_del
- 定义
目的:在user表中删除一名学生,将其存入学生删除记录user_del表中
DELIMITER $$ #修改结束标志,默认为分号
CREATE
TRIGGER `userdel` AFTER DELETE
ON `user`
FOR EACH ROW BEGIN
#old代表删除的数据集合
INSERT INTO `user_del` VALUES(NULL,old.snum,old.uname,NOW());
END$$
DELIMITER ; #结束标志改为默认分号
- 调用
DELETE FROM `user` WHERE id = 5
更新本表数据
如果在学生表(user)中新增一名学生后,让触发器把该数据的gid改为4。
按照正常的思路:在insert成功后利用触发器执行update语句,这样就会报错:
Can’t update table ‘user’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
应该使用set关键字,正确写法如下:
DELIMITER $$
CREATE
TRIGGER `updategid` BEFORE INSERT
ON `user`
FOR EACH ROW BEGIN
SET new.gid = '4'; #new代表插入的新数据集合
END$$
DELIMITER ;