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
相关产品推荐
相关产品推荐

