MySQL触发表中的更改

时间:2013-06-06 16:48:22

标签: mysql triggers insert

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

例如我有这张表:

用户:

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

值:

1:'test@test.com ':' 123456 ':' 1995年7月23日


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

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

table_name:'user',field_name:'birthdate',previous_value:'1995-07-23',new_value:'1996-07-23'

历史表:

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

有任何建议吗?

1 个答案:

答案 0 :(得分: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, '');
  • 一个语句触发器
  • 仅当新值与旧值不同时才会记录更改。
  • 负责NULL s。

这是 SQLFiddle 演示

注意:历史记录表中的id列生成了auto_increment,并引入了其他obj_id列来引用正在记录的对象的id