012 学习笔记--触发器

发布时间 2023-07-25 18:45:28作者: sunwugang

触发器:

触发器是与表有关的数据库对象,指在insert\update\delete之前或之后,触发并执行触发器中定义的SQL语句集合。

触发器的这种特性可以协助应用在数据库段确保数据的完整性,日志记录,数据校验等操作。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。

现在触发器还只支持行级触发,不支持语句级触发。

示例一:insert

注:new 表示新数据

-- 插入数据触发器
drop trigger if EXISTS tb_users_insert_trigger;
create trigger tb_users_insert_trigger
	after insert on tb_users for each row 
begin 
	insert into tb_logs(id,operation,operation_time,operation_id,operation_params) VALUES
	(null,"insert",NOW(),new.id,CONCAT('插入的数据为:id=',new.id,',name=',new.name,',age=',new.age,',status=',new.status,",gender=",new.gender,",phone=",new.phone));
	 
end;

-- 查看触发器
show TRIGGERS;
-- 触发或者说应用触发器
INSERT into tb_users(id,NAME,age,status,gender,phone)VALUES(null,'张三sss',18,'1','1','116');

示例二:update  

注:new 表示新数据,old表示原始老数据;当更改的数据行为多行数据时,触发器将会被触发多次(即,修改一行数据,触发一次)。

-- update 触发器
drop trigger if EXISTS tb_users_update_trigger;
create trigger tb_users_update_trigger
-- 	更新表之后触发
	after update on tb_users for each row 
-- 更新表之前触发
-- 	before update on tb_users for each row 
begin 
	insert into tb_logs(id,operation,operation_time,operation_id,operation_params) VALUES
	(null,"update",NOW(),new.id,
	 CONCAT('更新之前数据为:id=',old.id,',name=',old.name,',age=',old.age,',status=',old.status,",gender=",old.gender,",phone=",old.phone,
	        '|更新之后数据为:id=',new.id,',name=',new.name,',age=',new.age,',status=',new.status,",gender=",new.gender,",phone=",new.phone));

end;
-- 查看触发器
show TRIGGERS;
update tb_users set name ='张三new' where name ='张三';

示例三:delete

-- delete 触发器
drop trigger if EXISTS tb_users_delete_trigger;
create trigger tb_users_delete_trigger
-- 	删除表之后触发
	after delete on tb_users for each row 
begin 
	insert into tb_logs(id,operation,operation_time,operation_id,operation_params) VALUES
	(null,"delete",NOW(),old.id,CONCAT('更新之前数据为:id=',old.id,',name=',old.name,',age=',old.age,',status=',old.status,",gender=",old.gender,",phone=",old.phone));

end;
-- 查看触发器
show TRIGGERS;

delete from tb_users where name ='张三sss';
delete from tb_users where name ='张三封';