Mysql触发器


在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 ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值