更新时跟踪行的实际变化 table
tracking actual changes in rows when updating table
我有一个 table,我会根据代码中其他来源的值不断更新它。我更新的值可能与行中已有的值相同,也可能不同。
我需要某种算法可能是通过 mysql (db) 或其他方式(部分代码),以便我以后可以识别哪些行具有更改的值。
我更改了一个日期修改列。但这不是真正的指标,因为它会一直更新。我想要一种方法来确定某些预定义的列是否已更改值,
一个解决方案是这样的:我可以执行 select 查询,然后比较并更新 table 中已更改的标志。但这似乎很复杂,对我来说并不复杂,因为我有一个 table 和很多记录
另一个解决方案可能是将值的 md5 校验和保存在列中,并在更新时比较以前的 md5 和当前的 md5 等等。
我想知道最好的解决方案。
有一种相当简单的方法可以处理这个问题。让我们将其视为管理何时更新行的时间戳。
首先,我相信您知道,您的 table 需要一个带有 INSERT
和 UPDATE
默认设置的时间戳列。如果该列名为 ts
.
,则看起来像这样
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
其次,您可以使用这样的更新查询来更改一行中的值。
UPDATE stock
SET val1 = 'newval1',
val2 = 'newval2',
changed_by = 'current_user_id'
WHERE id = 'id_to_change'
AND NOT (val1 == 'newval1' AND val2 == 'newval2')
WHERE
上的 AND NOT
子句将阻止更新发生,除非 'newval1'
或 'newval2'
实际上会提供新值。这是有效的,因为没有行匹配更新中的 WHERE
子句。
当更新被阻止时,您自动设置的 ts
列将不会改变。 changed_by
列也不会设置为当前用户的 user_id
。所以,你有最近一次正版改动的时间和用户。
此外,MySQL 的许多宿主语言接口都有一个方法调用来确定最近的 UPDATE
操作影响了多少行。使用此技术,当行未更新时,您将返回零行。这可能对您的用户界面很方便。
此外,此技术使用单个查询,因此如果多个用户同时尝试更新同一行,它是安全的。无需使用交易来保证这一点。
(请注意,跟踪 changed_by
用户是可选的,并且只有在您的应用程序可以提供当前用户的实际 ID 时才有效。)
只要 WHERE id = 'id_to_change'
的数据库搜索速度很快,这就相当有效。
它确实需要重新处理应用程序的更新查询。但是解决这个问题的任何其他方法也是如此。
我有一个 table,我会根据代码中其他来源的值不断更新它。我更新的值可能与行中已有的值相同,也可能不同。
我需要某种算法可能是通过 mysql (db) 或其他方式(部分代码),以便我以后可以识别哪些行具有更改的值。
我更改了一个日期修改列。但这不是真正的指标,因为它会一直更新。我想要一种方法来确定某些预定义的列是否已更改值,
一个解决方案是这样的:我可以执行 select 查询,然后比较并更新 table 中已更改的标志。但这似乎很复杂,对我来说并不复杂,因为我有一个 table 和很多记录
另一个解决方案可能是将值的 md5 校验和保存在列中,并在更新时比较以前的 md5 和当前的 md5 等等。
我想知道最好的解决方案。
有一种相当简单的方法可以处理这个问题。让我们将其视为管理何时更新行的时间戳。
首先,我相信您知道,您的 table 需要一个带有 INSERT
和 UPDATE
默认设置的时间戳列。如果该列名为 ts
.
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
其次,您可以使用这样的更新查询来更改一行中的值。
UPDATE stock
SET val1 = 'newval1',
val2 = 'newval2',
changed_by = 'current_user_id'
WHERE id = 'id_to_change'
AND NOT (val1 == 'newval1' AND val2 == 'newval2')
WHERE
上的 AND NOT
子句将阻止更新发生,除非 'newval1'
或 'newval2'
实际上会提供新值。这是有效的,因为没有行匹配更新中的 WHERE
子句。
当更新被阻止时,您自动设置的 ts
列将不会改变。 changed_by
列也不会设置为当前用户的 user_id
。所以,你有最近一次正版改动的时间和用户。
此外,MySQL 的许多宿主语言接口都有一个方法调用来确定最近的 UPDATE
操作影响了多少行。使用此技术,当行未更新时,您将返回零行。这可能对您的用户界面很方便。
此外,此技术使用单个查询,因此如果多个用户同时尝试更新同一行,它是安全的。无需使用交易来保证这一点。
(请注意,跟踪 changed_by
用户是可选的,并且只有在您的应用程序可以提供当前用户的实际 ID 时才有效。)
只要 WHERE id = 'id_to_change'
的数据库搜索速度很快,这就相当有效。
它确实需要重新处理应用程序的更新查询。但是解决这个问题的任何其他方法也是如此。