想监听一张表里,A表内容有更新的话就将向B表插入数据,我结合了触发器和存储过程一起完成,下面是触发器的示例代码:
-- 创建账户表account
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
-- 创建日志表account_log
create table account_log(
id int(11) primary key auto_increment, -- 日志id
operation varchar(20), -- 操作类型(insert/update/delete)
operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 操作时间
operation_id int, -- 操作表的ID
operation_params varchar(500) -- 操作参数
);
下面是创建触发器代码:
-- 监听insert
delimiter $ -- 声明结束符为$
create trigger account_insert
after insert -- 插入操作之后
on account -- 当account表被插入数据之后
for each row -- 行级触发器
begin
-- 触发器功能: 往account_log添加一条日志: 记录插入操作的信息
-- new 关键字为新增的一条数据
-- new.id 表示插入到account表之后的id
-- 信息: 插入后(id=?,name=?,money=?)
insert into account_log
values(
null, -- id
'insert', -- operation
now(), -- operation_time
new.id, -- operation_id
concat('插入后(id=',new.id,',name=',new.name,',money=',new.money) -- operation_params
);
end$
delimiter ; -- 声明结束符为;
-- 监听update
-- 创建 update 型触发器
delimiter $ -- 声明结束符 $
create trigger account_update -- 创建触发器 account_update
after update -- 在 update 操作之后触发
on account -- 监听 account 表
for each row -- 行级触发器
begin
-- 往account_log写入日志信息
-- old关键字:update之前的数据;new关键字:update之后的数据
insert into account_log
values(
null, -- id
'update', -- operation
now(), -- operation_time
new.id, -- operation_id
concat( '修改前(id=',old.id,',name=',old.name,',money=',old.money,')',
'修改后(id=',new.id,',name=',new.name,',money=',new.money,')')); -- operation_params
end$
delimiter ; -- 声明结束符 ;
-- 创建 delete 型的触发器 , 完成删除数据时的日志记录
delimiter $ -- 声明结束符 $
create trigger account_delete -- 创建触发器 account_delete
after delete -- 在delete操作后触发
on account -- 监听 account 表
for each row -- 行级触发器
begin
-- 往account_log写入日志信息
insert into account_log
values(
null, -- id
'delete', -- operation
now(), -- operation_time
old.id, -- operation_id
concat('删除前(id=',old.id,',name=',old.name,',money=',old.money,')')); -- operation_params
end$
delimiter ; -- 声明结束符 ;
存储过程示例代:
-- 创建插入数据存储过程
CREATE PROCEDURE insert_data()
BEGIN
INSERT INTO user_info (which_date,name,money)
SELECT CURDATE(),name,money from account;
END
-- 创建删除数据存储过程
CREATE PROCEDURE delete_curdatedata()
BEGIN
delete from user_info where which_date=CURDATE();
END
回到最开始需求,监听account表有更新内容,则插入数据到user_info
-- 监听update
-- 创建 update 型触发器
delimiter $ -- 声明结束符 $
create trigger account_update -- 创建触发器 account_update
after update -- 在 update 操作之后触发
on account -- 监听 account 表
for each row -- 行级触发器
begin
-- 往account_log写入日志信息
-- old关键字:update之前的数据;new关键字:update之后的数据
insert into account_log
values(
null, -- id
'update', -- operation
now(), -- operation_time
new.id, -- operation_id
concat( '修改前(id=',old.id,',name=',old.name,',money=',old.money,')',
'修改后(id=',new.id,',name=',new.name,',money=',new.money,')')); -- operation_params
CALL delete_curdatedata();
CALL insert_data();
end$
delimiter ; -- 声明结束符 ;
参考文档https://blog.csdn.net/KKAZIQA/article/details/118027103
https://blog.51cto.com/u_16213417/12064613