MySQL怎样在触发器中引用新旧数据行_NEW与OLD关键字详解

MySQL触发器中通过NEW和OLD获取字段值:INSERT只有NEW,DELETE只有OLD,UPDATE两者都有;NEW在BEFORE中可修改,OLD始终只读;注意大小写、反引号包裹特殊列名及跨库操作限制。触发器里怎么拿到修改前后的字段值MySQL 触发器中用 NEW 和 OLD 代表当前操作涉及的行数据,不是变量,不能声明或赋值,是只读上下文对象。INSERT 触发器只有 NEW,DELETE 只有 OLD,UPDATE 两者都有。直接用 NEW.column_name 或 OLD.column_name 访问字段,注意大小写敏感(和表定义一致)。如果列名含空格或关键字,必须用反引号包裹:NEW.`order status`NEW 在 BEFORE INSERT 中可被修改(用于默认值、清洗),AFTER 中只读OLD 在任何时机都不可写,尝试赋值会报错:ERROR 1362 (HY000): Updating of OLD row is not allowed in trigger对未在 SET 子句中出现的字段,NEW.column 在 UPDATE 中仍为原值(不是 NULL)BEFORE UPDATE 触发器中改 NEW 字段没生效?常见现象:写了 SET NEW.updated_at = NOW(); 却发现时间没更新------大概率是触发器定义在了 AFTER 而非 BEFORE。AFTER 触发器里改 NEW 完全无效,语句已执行完毕;只有 BEFORE 阶段才能干预即将插入/更新的数据。检查触发器定义:SHOW CREATE TRIGGER trigger_name; 看开头是 BEFORE 还是 AFTER若想自动填充时间戳,必须用 BEFORE,并确保目标字段允许 NULL 或无默认值(否则可能冲突)对主键或唯一键字段,BEFORE UPDATE 中修改 NEW 可能引发重复键错误,需提前校验触发器里用 OLD 记日志,但 DELETE 时发现字段全是 NULL不是 OLD 失效,而是你查的字段在原表里定义为 TEXT 或 BLOB 类型,且触发器里用了函数如 CONCAT(OLD.content, ' deleted') ------ MySQL 在某些版本(尤其是 5.7)对大字段在触发器上下文中的处理不一致,可能返回 NULL。 橙篇 百度文库发布的一款综合性AI创作工具

相关推荐
小小测试开发10 小时前
安装 Python 3.10+
开发语言·人工智能·python
梦想不只是梦与想11 小时前
Python 中的装饰器
python·装饰器
我叫唧唧波11 小时前
Python+AI 全栈学习笔记
人工智能·python·学习
不会就选b11 小时前
MySQL之视图
数据库·mysql
copyer_xyf12 小时前
Python 异常处理
前端·后端·python
>no problem<12 小时前
基于cola5.0的基础设施层的多数据库切换方案思路
数据库·spring boot·mybatisplus·cola5.0·数据库迁移适配
OceanBase数据库官方博客12 小时前
OceanBase 赋能央国企:从发电到用电的全链路业务承载
数据库·oceanbase
麻雀飞吧12 小时前
期货多合约策略目标持仓怎么更新才不乱
python·区块链
Cthy_hy12 小时前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法
LSssT.13 小时前
【01】Python 机器学习
开发语言·python