MySQL如何在更新current_status前自动将值同步到同表previous_status列
实现方案:自动同步current_status旧值到previous_status
最适合的方案是使用数据库的BEFORE UPDATE触发器,不需要修改上层业务代码,完全在数据库层面自动完成字段同步,触发时机刚好在更新操作生效前执行,完全匹配需求。
以下是主流数据库的具体实现示例:
MySQL 实现
- 触发器创建语法如下:
DELIMITER // CREATE TRIGGER trg_lead_before_update BEFORE UPDATE ON lead FOR EACH ROW BEGIN -- 仅当current_status实际发生变更时才更新,避免无意义赋值 IF NEW.current_status <> OLD.current_status THEN SET NEW.previous_status = OLD.current_status; END IF; END // DELIMITER ;
- 语法说明:
OLD指代更新前的行数据,NEW指代即将写入的新行数据。
PostgreSQL 实现
- 先创建触发函数:
CREATE OR REPLACE FUNCTION sync_lead_status_history() RETURNS TRIGGER AS $$ BEGIN IF NEW.current_status <> OLD.current_status THEN NEW.previous_status = OLD.current_status; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
- 再将触发器绑定到lead表:
CREATE TRIGGER trg_lead_before_update BEFORE UPDATE ON lead FOR EACH ROW EXECUTE FUNCTION sync_lead_status_history();
SQL Server 实现
CREATE TRIGGER trg_lead_before_update ON lead INSTEAD OF UPDATE AS BEGIN UPDATE l SET l.previous_status = l.current_status, l.current_status = i.current_status FROM lead l INNER JOIN inserted i ON l.lead_id = i.lead_id WHERE l.current_status <> i.current_status; END
注意:触发器逻辑和原更新操作在同一个事务中,要么同时成功要么同时回滚,不会出现数据不一致问题。如果后续需要留存全量状态变更记录,也可以扩展一张独立的状态历史表,在触发器中增加插入历史记录的逻辑即可。
内容的提问来源于stack exchange,提问作者Ajajul Ansari
相关产品推荐
相关产品推荐

