更新表时跟踪行中的实际更改

时间:2015-02-07 13:59:43

标签: mysql algorithm audit-logging

我有一个表,我继续更新,从我的代码中的其他来源的值。我更新的值可能与行中已有的值相同,也可能不同。

我需要某种算法可能是通过mysql(db)或其他(代码的一部分),以便我以后可以识别哪些行有更改的值。

我更改了一个修改日期的列。但这不会是一个真正的指标,因为它将始终更新。我想要一种方法来确定某些预定义列是否已更改值

一个解决方案是:我可以执行选择查询,然后比较并更新表中更改的标志。但这似乎很复杂,不适合我,因为我有一张包含大量记录的表格

另一个解决方案可能是保存列中值的md5校验和,同时更新比较前一个md5和当前md5等等。

我想知道最佳解决方案。

1 个答案:

答案 0 :(得分:0)

有一个相当简单的方法来处理这个问题。我们可以将其视为在行的时间戳更新时进行管理。

首先,我确定您知道,您的表需要一个时间戳列,其中包含INSERTUPDATE的默认设置。如果列名为ts,则看起来像这样。

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

其次,您可以使用这样的UPDATE查询来更改行中的值。

UPDATE stock
   SET val1 = 'newval1', 
       val2 = 'newval2', 
       changed_by = 'current_user_id'
 WHERE id = 'id_to_change'
   AND NOT (val1 == 'newval1' AND val2 == 'newval2')

AND NOT上的WHERE条款会阻止更新发生,除非'newval1''newval2'实际提供新值。这是有效的,因为没有行与更新中的WHERE子句匹配。

如果阻止更新,则自动设置的ts列不会更改。 changed_by列也不会设置为当前用户的user_id。所以,你有最近真正改变的时间和用户。

此外,MySQL的许多主机语言接口都有一个方法调用,用于确定最近UPDATE操作影响了多少行。使用此技术,当行未更新时,您将返回零行。这可能对您的用户界面很方便。

此外,此技术使用单个查询,因此如果多个用户尝试同时更新同一行,则可以安全。没有必要使用交易来保证。

(请注意,跟踪changed_by用户是可选的,并且仅在您的应用程序可以提供当前用户的实际ID时才有效。)

只要数据库搜索WHERE id = 'id_to_change'能够快速运行,这就非常有效。

确实需要重新处理应用程序的UPDATE查询。但对于这个问题,任何其他方法也是如此。