当在MySQL中更新显式行时,是否仍要获取UPDATE
查询以返回实际更新的值?
+----+-------+---------------------+
| id | name | last_changed_values |
+----+-------+---------------------+
| 1 | Hans | (null) |
| 2 | Joe | (null) |
| 3 | Ralph | (null) |
+----+-------+---------------------+
UPDATE user SET user_name = "Bertil" WHERE user_id = 1
将输入Bertil
在
last_changed_values
中+----+-------+---------------------+
| id | name | last_changed_values |
+----+-------+---------------------+
| 1 | Bertil| Bertil |
| 2 | Joe | (null) |
| 3 | Ralph | (null) |
+----+-------+---------------------+
在GaborSch的帮助下,我创建了这个sqlfiddle。
CREATE TRIGGER names_BU BEFORE UPDATE ON `names`
FOR EACH ROW BEGIN
SET NEW.last_changed_values = CONCAT_WS(',', IF(new.name = old.name, NULL, new.name));
END/
但这不是
SET
last_changed_values
到new.name
(在本例中为Bertil
)。有没有办法获得新的价值?更新资料
似乎存储过程是区分大小写的。变成
SET NEW.last_changed_values = CONCAT_WS(',', IF(NEW.name = OLD.name, NULL, NEW.name));
可以正常工作。
最佳答案
不,MySQL中没有这样的选项。请记住,一次更新可以更改一条指令的几行。
但是,您可以创建一个BEFORE UPDATE
触发器,并逐一比较这些值,然后将更改的列名保存到last_changed_values
列中,如下所示:
ALTER TABLE mytable ADD COLUMN last_changed_values VARCHAR(200);
DELIMITER $$
CREATE TRIGGER `mytable_BU` BEFORE UPDATE ON `mytable`
FOR EACH ROW BEGIN
SET NEW.last_changed_values = CONCAT_WS(',', IF(new.col1 = old.col1, NULL, 'col1'), IF(new.col2 = old.col2, NULL, 'col2'), IF(new.col3 = old.col3, NULL, 'col3'));
END$$
DELIMITER ;
如果执行如下语句
UPDATE mytable SET col1=..., col2=...
WHERE id=1;
然后你可以像查询
SELECT last_changed_values FROM mytable
WHERE id=1;