MySQL返回更新的值

时间:2017-06-26 19:24:43

标签: mysql

当更新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会输入Bertillast_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));

按预期工作。

1 个答案:

答案 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;