触发器的概念:
    触发器是一种特殊的存储过程,不同于存储过程,触发器是通过事件触发
    执行,而不是手动调用执行的。
什么事触发事件?
    触发器(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只有new new表示将要插入或者已经插入的数据
UPDATE 既有old也有new old表示更新之前的数据 new表示更新之后的数据
DELETE 没有new只有old old表示删除前或已经被删除的数据

触发器条件使用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 ;

 

最后修改于 2021-09-23 10:03:55
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇