0

我想使用 mysql 在任何表上记录任何更新,但在日志中我想记录“旧”值和“新”值。

例如我有这张表:

用户:

+-------------------+
| id                |
| email             |
| password          |
| birthdate         |
+-------------------+

价值观:

1:'test@test.com':'123456':'1995-07-23'


我决定将 id=1 的生日更改为 '1996-07-23'

所以,我想登录到“历史”表如下:

table_name:“用户”,field_name:“生日”,previous_value:“1995-07-23”,new_value:“1996-07-23”

历史表:

+-------------------+
| id                |
| table_name        |
| field_name        |
| previous_value    |
| new_value         |
| history_datetime  |
+-------------------+

有什么建议可以实现吗?

4

1 回答 1

0

你可以试试这个

CREATE TRIGGER user_update
AFTER UPDATE ON user
FOR EACH ROW
  INSERT INTO history (obj_id, table_name, field_name, previous_value, new_value, history_datetime)
  SELECT NEW.id, 'user', 'email', OLD.email, NEW.email, NOW()
    FROM user
   WHERE IFNULL(NEW.email, '') <> IFNULL(OLD.email, '')
  UNION ALL
  SELECT NEW.id, 'user', 'birthdate', OLD.birthdate, NEW.birthdate, NOW()
    FROM user
   WHERE IFNULL(NEW.birthdate,'') <> IFNULL(OLD.birthdate, '');
  • 它单语句触发器
  • 只有当新值与旧值不同时,它才会记录更改。
  • 它照顾NULLs。

这是SQLFiddle演示

注意:id历史表中的列设为 auto_increment,并且obj_id引入了附加列来引用id正在记录的对象

于 2013-06-07T02:18:17.997 回答