You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:36:00