美文网首页
mysql--触发器和存储过程

mysql--触发器和存储过程

作者: 烂笔头2020 | 来源:发表于2024-10-22 15:28 被阅读0次

想监听一张表里,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

相关文章

网友评论

      本文标题:mysql--触发器和存储过程

      本文链接:https://www.haomeiwen.com/subject/jtjrdjtx.html