当更新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));
按预期工作。
答案 0 :(得分:0)
不,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;