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

MySQL触发器中OLD值与NEW值的区别是什么?

MySQL触发器中OLD与NEW值的区别

在MySQL触发器里,OLD和NEW是专门用来访问触发事件前后行数据的特殊变量,二者的核心区别围绕可用性和可修改性展开,结合不同触发场景来看更清楚:

1. 可用性范围

  • OLD:仅在UPDATE和DELETE触发器中存在,代表触发事件发生之前的行数据快照。比如删除用户前,OLD就存着这个用户删除前的所有字段值。
  • NEW:仅在INSERT和UPDATE触发器中存在,代表触发事件发生之后(或者将要写入)的行数据。比如插入新用户时,NEW就是即将插入到表中的新行数据。
  • 注意:INSERT触发器里没有OLD(因为触发前根本不存在该行),DELETE触发器里没有NEW(因为触发后该行已被删除)。

2. 数据可修改性

  • OLD:完全只读,你没法修改它的值——毕竟它是触发前的历史数据,改了也没意义。
  • NEW:在BEFORE INSERT或BEFORE UPDATE触发器里可以修改,比如插入前修正字段格式、给空字段设默认值;但在AFTER类型的触发器里是只读的,因为此时数据已经写入表中了。

实用示例

UPDATE触发器示例

CREATE TRIGGER update_user_email_log
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
    -- 记录邮箱修改前后的内容到日志表
    INSERT INTO email_change_log (user_id, old_email, new_email, change_time)
    VALUES (OLD.user_id, OLD.email, NEW.email, NOW());
    -- 强制新邮箱转为小写
    SET NEW.email = LOWER(NEW.email);
END;

DELETE触发器示例

CREATE TRIGGER backup_deleted_user
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
    -- 把即将删除的用户数据备份到归档表
    INSERT INTO users_archive (user_id, username, create_time)
    VALUES (OLD.user_id, OLD.username, OLD.create_time);
END;

INSERT触发器示例

CREATE TRIGGER set_default_user_status
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    -- 若未指定用户状态,默认设为"active"
    IF NEW.status IS NULL THEN
        SET NEW.status = 'active';
    END IF;
END;

简单说,OLD就是触发前的“旧数据快照”,NEW是触发后的“新数据实例”,不同触发场景下二者的存在性和可操作权限各不相同。

内容的提问来源于stack exchange,提问作者atul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:15:42