mysql - MYSQL更新触发检查所有列中的更改并将值插入其他表
问题描述
我来到了这段代码,但从这里我必须手动插入所有列并按每列检查
CREATE TRIGGER table_a_update BEFORE UPDATE ON table_a
FOR EACH ROW
BEGIN
IF (NEW.column1 <=> OLD.column1)
THEN
INSERT INTO table_updates(table, object_id, user_id, column, old_value, new_value)
VALUES ("table_a",NEW.id, NEW.user_id, "column1", OLD.column1, new.column1)
END IF;
IF (NEW.column2 <=> OLD.column2)
THEN
INSERT INTO table_updates(table, object_id, user_id, column, old_value, new_value)
VALUES ("table_a",NEW.id, NEW.user_id, "column2", OLD.column2, new.column2)
END IF;
(other columns... ifs)
END;
我想知道如何从 NEW 中获取与 OLD 列有差异的所有列,然后通过类似于此示例的方式将其插入到我不知道的地方:
BEGIN
for(columns(NEW) as $column){
IF (NEW.$column <=> OLD.$column)
THEN
INSERT INTO table_updates(table, object_id, user_id,column, old_value, new_value)
VALUES ("table_a", NEW.id, NEW.user_id, $column, $OLD[$column], $NEW[$column])
END IF;
}
END;
解决方案
国际大学联盟:
DELIMITER $$
CREATE TRIGGER before_update_table_a
BEFORE UPDATE ON table_a
FOR EACH ROW BEGIN
IF (NEW.col1 <> OLD.col1) THEN
INSERT INTO table_updates (col1, col2, ...
VALUES (OLD.col1, NEW.col2 ...
END IF;
IF (NEW.col2 <> OLD.col2) THEN
INSERT INTO table_updates (col1, col2, ...
VALUES (NEW.col1, OLD.col2 ...
END IF;
...
END $$
DELIMITER ;
我相信您需要DELIMITER
在此触发器中使用关键字,如果您想了解更多相关信息,请查看此问题。
推荐阅读
- java - 我想读到 JAVA 文件的倒数第二行
- python - 在 Python 中搜索 SQLite 查询
- javascript - 使用 setter 方法更新现有对象值
- html - 如何删除 textInput 和错误消息之间的边距
- r - 如何根据 R 中的标准查找数据和打印值?
- excel - 在 Laravel 6 中从 Excel 导入数据时出错?
- python - Django - 在将传入数据保存为对象之前覆盖哪个 create() 方法
- c# - EF Core - 指定必须在字符串中才能成功保存的字符
- python - 如何等待插入正确的元素?(webscrape)
- php - 如何保护 MP4 视频(令牌、IP 等)