MySQL触发表中的更改 我想使用mysql记录任何表上的任何更新,但在日志中我想记录“旧”值和“新”值。
例如,我有这个表: 用户: 价值观: 1:'test@test.com“:‘123456’:‘1995-07-23’ 我决定把id=1的生日改为'1996-07-23' 因此,我想登录“历史记录”表,如下所示: 表格名称:“用户”,字段名称:“出生日期”,以前的值:“1995-07-23”,新的值:“1996-07-23” 历史记录表: 有什么建议吗?你可以试试这个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
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, '');