MySQL触发器未更新指定列时NEW.colname取值原因及实现方法
问题解答
问题1:未更新col1时NEW.col1返回原有值的原因
MySQL触发器中的NEW伪行代表的是UPDATE语句执行完成后该行的完整数据状态,而非仅包含UPDATE语句中显式指定更新的字段。当UPDATE语句未指定修改某个字段时,MySQL会自动将该字段的原有值(即OLD伪行中对应字段的值)赋值给NEW的对应字段,因此哪怕你没有修改col1,NEW.col1也会保留原有的值。
问题2:仅当显式更新col1时触发插入的实现方案
你可以使用MySQL触发器内置的UPDATE(<字段名>)函数实现需求,该函数会返回布尔值:如果当前UPDATE语句中显式指定了修改对应字段,就返回TRUE,完全不关心新旧值是否相等,正好符合你的要求。
具体实现步骤如下:
- 先创建用于存储col1更新记录的目标表(示例表名
col1_log,可按需调整结构)
CREATE TABLE col1_log( log_id INT AUTO_INCREMENT PRIMARY KEY, record_id INT COMMENT '对应sample_table的id', col1_value VARCHAR(10) COMMENT '更新的col1值', update_time DATETIME DEFAULT CURRENT_TIMESTAMP );
- 修改触发器逻辑,加入判断条件
DELIMITER $$ DROP TRIGGER IF EXISTS sample_trigger; CREATE TRIGGER sample_trigger BEFORE UPDATE ON sample_table FOR EACH ROW BEGIN -- 仅当UPDATE显式指定更新col1时触发插入 IF UPDATE(col1) THEN INSERT INTO col1_log(record_id, col1_value) VALUES(NEW.id, NEW.col1); END IF; END $$ DELIMITER ;
验证逻辑:
- 执行
UPDATE sample_table SET col2 = 'ccc' WHERE id = 1;时,没有指定更新col1,不会触发插入 - 执行
UPDATE sample_table SET col1 = 'aaa' WHERE id = 1;时,哪怕新旧col1值相同,只要显式指定了更新col1,就会插入记录到col1_log
内容的提问来源于stack exchange,提问作者Manonandan S K
相关产品推荐
相关产品推荐

