触发器的概念:
触发器是一种特殊的存储过程,不同于存储过程,触发器是通过事件触发
执行,而不是手动调用执行的。
什么事触发事件?
触发器(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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

