mysql 的触发器的问题,我想写一个触发器,用来监控table1的price字段,或者监控table1的多个字段,当这些个字段发生改变的时候,在table_log1总记录该条记录的改变之前的值与改变之后的值,就是一个改变日志!求方法
mysql 的触发器的问题,我想写一个触发器,用来监控table1的price字段,或者监控table1的多个字段,当这些个字段发生改变的时候,在table_log1总记录该条记录的改变之前的值与改变之后的值,就是一个改变日志!求方法
我来聊聊思路吧。
记录 log 型的触发器,可以选择 AFTER UPDATE 来监控表。
当表 A 被更新时,使用 AFTER UPDATE 将更新后的数据更新至专门记录 log 的表 B 中。
可以使用 old / new 语法来记录更新表 A 中的数据前后变化,把前后变化也记录在 log 表 B 中。
DELIMITER //
CREATE TRIGGER log_sales_updates
AFTER UPDATE
ON sales
FOR EACH ROW
Insert into audit_log(sales_id, previous_amount, new_amount, updated_by, updated_on) VALUES (NEW.sales_id,OLD.sales_amount, NEW.sales_amount,(SELECT USER()), NOW() )//
DELIMITER ;
类似这种,这个监控了 sales 表,当 sales 表中更新了 sales_amount 时,将更新前后的两组数据都记录在 log_sales_updates 表中。
这个例子来自 《MySQL 触发器的创建、使用、查看、删除教程及应用场景实战案例》教程。
这里面讲了触发器的 6 种情况及对应的 6 种应用场景。推荐一下。
4 回答1.3k 阅读✓ 已解决
8 回答1.2k 阅读
3 回答1k 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.4k 阅读
1 回答845 阅读✓ 已解决
1 回答641 阅读✓ 已解决
-- 1建表
CREATE TABLE
test_update_trigger
(id
int(10) NOT NULL AUTO_INCREMENT,age
varchar(10) DEFAULT NULL,PRIMARY KEY (
id
)) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '测试触发器';
CREATE TABLE
test_log
(id
int(10) NOT NULL AUTO_INCREMENT,log_text
varchar(100) DEFAULT NULL,PRIMARY KEY (
id
),) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '日志';
-- 2插入数据
insert into test_update_trigger values(1,10),(2,20);
-- 3设置触发器
create trigger tri_test_update
after update on test_update_trigger
for each row
begin
insert into test_log(update_id,log_text) values(NEW.id,concat(cast(NEW.age as char),'修改为:',cast(OLD.age as char)));
end
-- 4修改
update test_update_trigger set age=30 where id=2;
-- 5查询结果
select * from test_log;
id update_id log_text
1 2 30修改为:20