Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL触发表中的更改 我想使用mysql记录任何表上的任何更新,但在日志中我想记录“旧”值和“新”值。_Mysql_Triggers_Insert - Fatal编程技术网

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

MySQL触发表中的更改 我想使用mysql记录任何表上的任何更新,但在日志中我想记录“旧”值和“新”值。,mysql,triggers,insert,Mysql,Triggers,Insert,例如,我有这个表: 用户: 价值观: 1:'test@test.com“:‘123456’:‘1995-07-23’ 我决定把id=1的生日改为'1996-07-23' 因此,我想登录“历史记录”表,如下所示: 表格名称:“用户”,字段名称:“出生日期”,以前的值:“1995-07-23”,新的值:“1996-07-23” 历史记录表: 有什么建议吗?你可以试试这个 CREATE TRIGGER user_update AFTER UPDATE ON user FOR EACH ROW IN

例如,我有这个表:

用户: 价值观:

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

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

因此,我想登录“历史记录”表,如下所示:

表格名称:“用户”,字段名称:“出生日期”,以前的值:“1995-07-23”,新的值:“1996-07-23”

历史记录表: 有什么建议吗?

你可以试试这个

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, '');
它是一个语句触发器 只有当新值与旧值不同时,它才会记录更改。 它处理空值。 这是演示


注意:历史记录表中的id列自动递增,并引入了额外的obj_id列来引用正在记录的对象的id

这就是:@MichaelBarquero有帮助吗?你的问题需要更多的帮助吗?
+-------------------+
| id                |
| table_name        |
| field_name        |
| previous_value    |
| new_value         |
| history_datetime  |
+-------------------+
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, '');