首页 > 解决方案 > 如果我没有更新该列,则在 MySQL 触发器中获取 NEW.colname 的现有值

问题描述

我正在使用 mysql 8.0.23

我的桌子

CRETAE TABLE sample_table(
    id INT AUTO_INCREMENT PRIMARY KEY,
    col1 VARCHAR(10) DEFAULT NULL,
    col2 VARCHAR(10) DEFAULT NULL
);

让我们插入一行

INSERT INTO sample_table(col1, col2) VALUES('aaa','bbb');

插入后的表格

ID col1 col2
1 啊啊啊 bbb

更新表前触发

DELIMITER $$
CREATE TRIGGER sample_trigger BEFORE UPDATE ON sample_table
FOR EACH ROW 
BEGIN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = NEW.col1;
END $$
DELIMITER ;

更新声明

UPDATE sample_table SET col2 = 'ccc' WHERE id = 1;

在这里我只更新 col2 但我得到 message_text 的“aaa”,它背后的原因是什么?

我想为只有 col1 的每次更新插入 col1 值。

我无法在触发器中添加对 old.col1 <> new.col1 的检查。在某些情况下,我可能会得到相同的值,然后该值也应该插入到另一个表中。

如何做到这一点?请帮我。非常感谢。

标签: mysqltriggers

解决方案


OLD 具有行的所有旧值和 NEW所有列。

所以检查新旧是否不同

DELIMITER $$
CREATE TRIGGER sample_trigger BEFORE UPDATE ON sample_table
FOR EACH ROW 
BEGIN
    IF OLD.col1 <> NEW.col1 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = NEW.col1;
    END IF;
END $$
DELIMITER ;

推荐阅读