1) 触发器的概念
简单的说,就是一张表发生了某件事(插入,删除,更新),然后自动触发了预先编写好的若干条SQL执行。
缺点就是难以维护,推荐在代码中处理逻辑。
2)例子(创建一个触发器)
2.1 创建俩张表 user 和user_history
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_history` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`operatetype` varchar(200) NOT NULL,
`operatetime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意事项:
DELIMITER:改变输入的结束符,默认情况下输入结束符是分号;,这里把它改成了两个分号;;,这样做的目的是把多条含分号的语句做个封装,全部输入完之后一起执行,而不是一遇到默认的分号结束符就自动执行;
new:当触发插入和更新事件时可用,指向的是被操作的记录
old: 当触发删除和更新事件时可用,指向的是被操作的记录
2.2 创建用户表添加数据事件对应的触发器
DROP TRIGGER IF EXISTS `tri_insert_user`;
DELIMITER ;;
CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin
INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user', now());
end
;;
DELIMITER ;
2.3 创建用户表更新事件对应的触发器
DROP TRIGGER IF EXISTS `tri_update_user`;
DELIMITER ;;
CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin
INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now());
end
;;
DELIMITER ;
2.4 创建用户表 删除事件对应的触发器
DROP TRIGGER IF EXISTS `tri_delete_user`;
DELIMITER ;;
CREATE TRIGGER `tri_delete_user` AFTER DELETE ON `user` FOR EACH ROW begin
INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (old.id, 'delete a user', now());
end
;;
DELIMITER ;
三个触发器写完以后 ,我们就可以去测试一下效果;
对用户表进行数据的增删改 ,观察 user_history的变化。
INSERT INTO user(account, name, address) VALUES ('user1', 'user1', 'user1');
INSERT INTO user(account, name, address) VALUES ('user2', 'user2', 'user2');
UPDATE user SET name = 'user3', account = 'user3', address='user3' where name='user1';
DELETE FROM `user` where name = 'user2';
2.5 如何查看MySQL中存在哪些触发器
2.6 删除触发器
drop trigger 触发器名;
2.7 像本文中用到的连接数据库工具是navicat ,那么可以直接在设计表的时候创建触发器。
可以参考:https://jingyan.baidu.com/article/36d6ed1f76ec9e1bcf4883aa.html
2.8 接下来我想补充的一点是如何在触发器中申明变量 ,给变量赋值。
business 表的id 和project表的 bid 关联。
创建一个触发器 ,(点击设计表,点击添加触发器。)
执行sql
INSERT INTO `project`(`bid`, `customer_name`, `project_name`, `project_group`, `project_address`, `project_leader`, `superior_manager`, `business_leader`, `project_checker`, `is_del`, `price`) VALUES (277, '客户名称2222', '项目名称33333', '111', '湖南', '测试人员66', '测试人员66', '测试人员66', '测试人员66', '0', 2.1200);
可以看到business 表的金额有变化