1

我有一个表格,我会根据我的代码中其他来源的值不断更新。我更新的值可能与行中已有的值相同,也可能不同。

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

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

一种解决方案是:我可以进行选择查询,然后比较并更新表中更改的标志。但这似乎很复杂,对我来说并不复杂,因为我有一张有很多记录的表

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

我想知道最好的解决方案。

4

1 回答 1

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. 因此,您拥有最近一次真正更改的时间和用户。

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

此外,此技术使用单个查询,因此如果多个用户同时尝试更新同一行,它是安全的。无需使用交易来保证这一点。

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

只要数据库搜索WHERE id = 'id_to_change'快速工作,这是相当有效的。

它确实需要修改应用程序的 UPDATE 查询。但是任何其他方法也可以解决这个问题。

于 2015-02-07T14:20:41.183 回答