mysql触发记录,查找更改的列

mysql触发记录,查找更改的列,第1张

概述我正在编写一个触发器来跟踪表中发生的所有更改.不幸的是,这个表有150列,我想避免在代码中编写每一列(例如new.col1,new.col2 ....),因此我在“更新触发器后”编写了一个以下查询INSERT INTO logs SELECT *, NOW() FROM abc WHERE abc.id = NEW.Id; 由于更新查询中未更改的数据重复,此

我正在编写一个触发器来跟踪表中发生的所有更改.不幸的是,这个表有150列,我想避免在代码中编写每一列(例如new.col1,new.col2 ….),因此我在“更新触发器后”编写了一个以下查询

INSERT INTO logs SELECT *,Now() FROM abc WHERE abc.ID = NEW.ID;

由于更新查询中未更改的数据重复,此想法导致多个问题.

简而言之,我想动态地找出哪些列是更新查询的一部分,如果不可能,有一种方法可以遍历“new”行的所有列,这样我就可以动态地比较旧的.@ colname == new @ Colname?

我已经看过了
Oracle PL/SQL: Loop Over Trigger Columns Dynamically,How to determine if anything changed in update trigger in t-sql和MySQL UPDATE trigger: INSERTing the values of the columns that actually changed.

最后一个链接是关闭我需要的只有一个区别,我不想在下面的语句中硬编码列名,因为我在所有表中有超过100列我将要编写类似的触发器!!

IF NEW.column1 <> olD.column1 THEN INSERT INTO... END IF; IF NEW.column2 <> olD.column2 THEN INSERT INTO... END IF
最佳答案我今天早上对此进行了一些研究,看起来我遇到了与你相同的搜索结果.最终,我认为没有办法遍历所有表列并引用相应的旧/新值.我正在决定明确检查每一列,然后记录:

IF (NEW.fld1 <> olD.fld1) OR (NEW.fld1 IS NOT NulL AND olD.fld1 IS NulL) OR (NEW.fld1 IS NulL AND olD.fld1 IS NOT NulL) THEN INSERT INTO `fld_audit` (`table`,`fldname`,`oldval`,`newval`) VALUES ("tblname","fld1",olD.fld1,NEW.fld1); END IF; IF (NEW.fld2 <> olD.fld2) OR (NEW.fld2 IS NOT NulL AND olD.fld2 IS NulL) OR (NEW.fld2 IS NulL AND olD.fld2 IS NOT NulL) THEN INSERT INTO `fld_audit` (`table`,"fld2",olD.fld2,NEW.fld2); END IF; ...

我找到了另一个解决方案here.理论上你可以有3个分隔列表,一个用于列名,一个用于旧val,一个用于新val.您必须显式引用旧的和新的val,但这将是一行(更容易维护或复制/粘贴以在其他表上实现),然后您可以循环.所以在伪代码中,它看起来像这样:

fIElds_array = concat_ws(",","fld2");old_vals_array = concat_ws(",olD.fld2);new_vals_array = concat_ws(",NEW.fld1,NEW.fld2);foreach fIElds_array as key => fIEld_name     INSERT INTO `fld_audit` (`table`,`newval`)     VALUES ("tblname",fIEld_name,old_vals_array[key],vew_vals_array[key]);

我没想过太多.您可能需要调用存储过程而不是设置变量.但它可能值得研究.我已经在我的触发器上花了足够的时间.不确定我能否(对我的老板)验证更优雅的解决方案的试错时间. 总结

以上是内存溢出为你收集整理的mysql触发记录,查找更改的列全部内容,希望文章能够帮你解决mysql触发记录,查找更改的列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1168436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存