Navicat中简单触发器的使用(初级,已完善)
笔者是SQL初学者,由于在日常工作中使用Excel处理数据时感觉有很多方面非常不便,现在正在学习使用Navicat来操作MySQL数据库来更好地解决实际工作中的问题,欢迎一起交流讨论。
现有一张考勤表“kaoqin”,如下:
此时我想删除表中的一条记录之前,自动将要删除的这条记录添加到另一个表“kaoqin_copy1”中:
此时我们将要用到mysql中的触发器:
触发器的特性:
1、有begin end体,begin end;之间的语句可以写的简单或者复杂
2、什么条件会触发:I、D、U
3、什么时候触发:在增删改前或者后
4、触发频率:针对每一行执行
5、触发器定义在表上,附着在表上。
也就是由事件来触发某个操作,事件包括INSERT语句,UPDATE语句和DELETE语句;可以协助应用在数据库端确保数据的完整性。
触发器的语法:
delimiter 自定义结束符号 create trigger 触发器名字 触发时间 触发事件 on 表 for each row begin -- 触发器内容主体,每行用分号结尾 end 自定义的结束符合 delimiter ;
那此时在Navicat中应该如何使用触发器来实现这一操作呢?
按上图步骤为kaoqin表添加名为tr1的触发器,触发器内容主体如下:
INSERT INTO kaoqin_copy1(`序号`, `姓名`, `文件名称`, `文件描述`, `时长H`, `备注`)
VALUES (OLD.`序号`, OLD.`姓名`, OLD.`文件名称`, OLD.`文件描述`, OLD.`时长H`, OLD.`备注`);
此时的OLD表示将要删掉的原数据
最后来看一下效果,删除kaoqin表中序号为330的数据
返回查看kaoqin_copy1表中出现了刚才删除的数据
2022.08.31完善内容:稍微复杂一点的触发器
现在我们在触发器主体语句中加入一些业务逻辑,而不是仅仅将记录转移到另一张表
同样是一张考勤表“kaoqin”:
现在需要每当插入一条“请假单”数据后,在另一张表“kaoqin_copy2”中生成请假单编号
在考勤表kaoqin中添加以下触发器
BEGIN
IF
( NEW.`文件名称` = '请假单' ) THEN
INSERT INTO kaoqin_copy2 ( `序号`, `姓名`, `文件名称`, `文件描述`, `时长H`, `请假单编号` )
VALUES
(
NEW.`序号`,
NEW.`姓名`,
NEW.`文件名称`,
NEW.`文件描述`,
NEW.`时长H`,
CASE
WHEN NEW.time THEN
CONCAT(
'QJ',
SUBSTRING( NEW.time, 1, 4 ),
MID( NEW.time, 6, 2 ),
MID( NEW.time, 9, 2 ),
RIGHT ( NEW.time, 5 )
)
END
);
END IF;
END
插入一条请假单数据测试一下:
INSERT INTO kaoqin (`序号`,`姓名`,`文件名称`,`文件描述`,`时长H`) VALUES (3,'CC','请假单','漏打卡',2)
kaoqin_copy2表自动生成了编号
半年多时间过去,笔者已经从初学者顺利入门了,本篇博客作为我半年多来阅读量最高的一篇,非常惊喜,今天终于抽出时间把半年前挖的坑(说要完善本博客的)给填上了,希望对刚入门的SQL新手和Navicat初学者带来一些帮助,本文章对触发器的介绍就到这里,实际业务场景的触发器还有更多的应用方式且有的会复杂得多,希望各位接下来能在实践中去灵活运用触发器。