当在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_valuesnew.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;

07-28 02:41
查看更多