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 触发器名字 触发时间 触发事件 onfor 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初学者带来一些帮助,本文章对触发器的介绍就到这里,实际业务场景的触发器还有更多的应用方式且有的会复杂得多,希望各位接下来能在实践中去灵活运用触发器。

posted @ 2022-01-17 22:32  Fancy[love]  阅读(9852)  评论(0编辑  收藏  举报