mysql - 如果我没有更新该列,则在 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 的检查。在某些情况下,我可能会得到相同的值,然后该值也应该插入到另一个表中。
如何做到这一点?请帮我。非常感谢。
解决方案
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 ;
推荐阅读
- python - 如何在python中选择异步或同步方法变体?
- php - 通过 PHP 从 Unity 上传图像并将其存储在文件夹中
- text - 更改长度属性时,SwiftUI 文本不适合
- python - 排除数组中不包含特定小数的元素
- android - 如何用凌空解决“我的请求执行了两次”?
- typescript - 如何在不编译为 JS 的情况下使用用 TypeScript 编写的自定义 tslint 规则和 vscode-tslint?
- shell - 投影随机图像/蒙太奇
- junit5 - 我们如何在 MicronautTest 类中为同一个控制器运行多个测试?
- c++ - 线程的 C++ 向量在加入时随机崩溃
- java - Java 是否支持带有 LDAP 引用的 StartTLS