09-23MySQL触发器

触发器的概念:

触发器是一种特殊的存储过程,不同于存储过程,触发器是通事件触发执行,而不是手动调用执行的。

什么事触发事件?

触发器(trigger),是指表中内容发生改变(增、删、改)时,系统会自动触发并执行的事件。

作用:

  1. 可以在触发时,校验或转换数据,保证数据安全。

  2. 触发器发生错误时,前面用户执行成功的操作会被回滚。 ...

表结构

CREATE DATABASE /*!32312 IF NOT EXISTS*/`demo` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `demo`;

/*Table structure for table `flowers` */

DROP TABLE IF EXISTS `flowers`;

CREATE TABLE `flowers` (
  `f_id` BIGINT(18) NOT NULL AUTO_INCREMENT COMMENT '花呗表id',
  `f_credit_points` INT(4) NOT NULL COMMENT '信用积分',
  `f_quota` INT(5) NOT NULL COMMENT '花呗额度',
  `f_mapping_user` BIGINT(18) NOT NULL COMMENT '用户id',
  PRIMARY KEY (`f_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `u_id` BIGINT(18) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `u_name` VARCHAR(15) NOT NULL COMMENT '用户名',
  `u_sex` CHAR(1) NOT NULL DEFAULT '男' COMMENT '性别',
  `u_createtime` DATETIME NOT NULL COMMENT '创建时间',
  `u_eff` INT(1) NOT NULL DEFAULT '1' COMMENT '有效',
  PRIMARY KEY (`u_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 创建触发器

DELIMITER $$
/*自定义结束符号*/
/*创建*/
CREATE
    /*TRIGGER 触发器*/
    /*库名+触发器名*/
    /*BEFORE/AFTER 在sql之前执行还是之后执行*/
    /*INSERT/UPDATE/DELETE触发条件*/
    TRIGGER `demo`.`userflowers` AFTER INSERT
    /*作用于哪个表*/
    ON `demo`.`user`
    /*每行都受影响,都执行,行级触发器*/
    FOR EACH ROW BEGIN
	/*触发执行的语句*/
	INSERT INTO `flowers`(`f_credit_points`,`f_quota`,`f_mapping_user`)
	VALUE(100,1000,new.u_id);
	
    END$$
DELIMITER ;

执行语句

INSERT INTO `user`(`u_name`,`u_sex`,`u_createtime`) VALUE("张三","女","2021-09-23 09:34:00");
new和old的使用
INSERT没有old只有newnew表示将要插入或者已经插入的数据
UPDATE既有old也有newold表示更新之前的数据 new表示更新之后的数
DELETE没有new只有oldold表示删除前或已经被删除的数据

触发器条件使用if elseif else

DELIMITER $$

CREATE
    TRIGGER `demo`.`userupdate` AFTER UPDATE
    ON `demo`.`user`
    FOR EACH ROW BEGIN
	/*判断是否有效字段变为0*/
	IF new.`u_eff` = 0 THEN
		/*删除花呗*/
		DELETE FROM `flowers` WHERE `f_mapping_user` = new.u_id;
	ELSEIF  new.`u_eff` = 1 THEN
		/*添加花呗*/
		INSERT INTO `flowers`(`f_credit_points`,`f_quota`,`f_mapping_user`)
		VALUE(100,1000,new.u_id);
	ELSE 
		/*其它情况*/
	END IF;
    END$$

DELIMITER ;

变量的使用

DELIMITER $$

USE `demo`$$

DROP TRIGGER /*!50032 IF EXISTS */ `userflowers`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `userflowers` AFTER INSERT ON `user` 
    FOR EACH ROW BEGIN
	/*触发执行的语句*/
	INSERT INTO `flowers`(`f_credit_points`,`f_quota`,`f_mapping_user`)
	VALUE(100,1000,new.u_id);
	/*
		用户变量:以@开始,形式为 @变量名 用户变量只针对当前客户端生效
		
		全局变量:定义方式 set GLOBAL 变量名,或者 set @@global.变量名
		对所有客户端生效,但是具有super权限才可以设置全局变量
	*/
	SELECT COUNT(*) FROM USER INTO @num;
	
	UPDATE `statistics` SET `users` = @num WHERE s_id = 1;
	
    END;
$$

DELIMITER ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值