触发器(TRIGGER): 是Mysql数据库5.0版本后引入的, 触发器是一种类似存储过程的特殊类型, 通过事件触发而执行,在执行insert/update/delete
语句之前或之后去执行触发器中定义的SQL语句. 存储过程是需要主动调用执行的.
总结: 触发器是被动执行,需要有触发条件,即表有新增/更新/删除操作才会去执行触发器.
触发器类型 | 参数说明 |
---|---|
insert | NEW 表示将要或者已经新增的数据 |
update | OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据 |
delete | OLD 表示将要或者已经删除的数据 |
1 在写入数据前,可以强制检验或转换数据等.
2 触发器执行错误,前面执行成功的SQL会撤销,形成事务回滚.
说明:
insert 前后/update前后/delete前后
)DELIMITER $
CREATE TRIGGER 触发器名称
BEFORE/AFTER INSERT/UPDATE/DELETE
ON 表名称
【 FOR EACH ROW 】--行级触发器
BEGIN
触发器过程体(一组合法的SQL语句)
END $
DELIMITER ;
触发器没有修改功能,可以先删除,后创建.
DROP TRIGGER 触发器名称;
-- 查看所有触发器
SHOW TRIGGERS;
-- 查看触发器创建语句
SHOW CREATE TRIGGER 触发器名字;
-- 创建学生表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 准备基础数据
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (1, 'Jone', 18, '[email protected]');
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (2, 'Jack', 20, '[email protected]');
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (3, 'Tom', 28, '[email protected]');
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (4, 'Sandy', 21, '[email protected]');
-- 创建学生操作日志表
CREATE TABLE user_log (
id INT (20) NOT NULL AUTO_INCREMENT,
operation VARCHAR (20) NOT NULL COMMENT '操作类型, insert/update/delete',
operate_time DATETIME NOT NULL COMMENT '操作时间',
operate_id INT (11) NOT NULL COMMENT '操作表的ID',
operate_params VARCHAR (500) COMMENT '操作参数',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 ;
INSERT触发器
DELIMITER $
CREATE TRIGGER user_log_insert_trigger
AFTER INSERT
ON user
FOR EACH ROW
BEGIN
INSERT INTO user_log (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'insert',NOW(),new.id,CONCAT('插入后(id:',new.id,', name:',new.name,', age:',new.age,', salary:',new.email,')'));
END $
DELIMITER ;
UPDATE触发器
DELIMITER $
CREATE TRIGGER user_log_update_trigger
AFTER UPDATE
ON user
FOR EACH ROW
BEGIN
INSERT INTO user_log (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'update',NOW(),new.id,CONCAT('修改前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.email,') , 修改后(id',new.id, 'name:',new.name,', age:',new.age,', salary:',new.email,')'));
END $
DELIMITER ;
DELETE触发器
DELIMITER $
CREATE TRIGGER user_log_delete_trigger
AFTER DELETE
ON user
FOR EACH ROW
BEGIN
INSERT INTO user_log (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'delete',NOW(),old.id,CONCAT('删除前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.email,')'));
END $
DELIMITER ;
INSERT INTO `test`.`user`(`id`, `name`, `age`, `email`) VALUES (5, 'Billie', 30, '[email protected]');
UPDATE user SET age = 18 WHERE id = 5;
DELETE FROM user WHERE id = 5;
mysql触发器不能对同一张表进行修改操作,否则会报错.(只能是,通过触发器去修改其他表数据)
参考资料:
https://caochenlei.blog.csdn.net/article/details/107640904
https://blog.csdn.net/babycan5/article/details/82789099