仅当行中的其他信息发生更改时才更新MySQL字段

时间:2011-10-06 17:06:29

标签: mysql

我有一个问题,我希望字段以与时间戳类型字段类似的方式工作,如果记录有其他更改,它只会在更新时更新。

我使用php用myisam表更新mysql数据库。

使用以下示例表,其中包含以下字段的一行; -

UNIQUEID : 1
TITLE    : Example
AMENDAT  : (timestamp)
AMENDBY  : Andy

我有一些处理表格维护的代码。对表的更新使用(例如)以下语句; -

update example set TITLE="New Title",AMENDBY="Andy" where UNIQUEID=1 ;

此语句正常工作并更新包括AMENDAT时间戳字段的行。

如果其他用户进行相同的更改; -

update example set TITLE="New Title",AMENDBY="Bob" where UNIQUEID=1 ;

同样,一切都按预期工作。

但是,当没有对语句中的任何列进行任何更改时,可能会调用update语句(这在现实世界中是可能的,因为我在表中有大量字段,这些字段是所有更新一次,我不希望编码检查字段的前后值 - 我只是让更新采取紧张); -

update example set TITLE="Example",AMENDBY="Andy" where UNIQUEID=1 ;

在这种情况下,MySQL决定不需要做任何事情,因此它不会更新AMENDAT时间戳(到目前为止都是好的)。

但是如果另一个用户做同样的事情; -

update example set TITLE="Example",AMENDBY="Bob" where UNIQUEID=1 ;

然后由于AMENDBY字段的更改而更新行。因此,即使实际数据没有改变,修正细节也有(这对我的修正跟踪不利)。

我目前解决此问题的方法是使用以下语句进行更新; -

update example set TITLE="XYZ",AMENDBY="XYZ",AMENDAT=NULL where UNIQUEID=123 ;

这会强制每次更新,因此修订详细信息将反映最后一个用户保存记录,无论他们是否进行了任何更改。显然这不太理想。

是否有任何方法只有在记录中的其他字段发生更改时才更新AMENDBY字段,就像时间戳类型字段的默认功能一样?

我意识到这个问题很容易通过对MySQL进行两次单独调用,一次进行更新并检查返回(更新的记录数)是否进行第二次调用来更新修订细节,但这是一个凌乱而不是很优雅的解决方案。

请记住,我有大量的表以相同的方式设置,每个表都有任意数量的字段,所以我不想要一个需要大量调用MySQL的解决方案,其中包括一个if每个字段的声明,可能会也可能不会更新。

1 个答案:

答案 0 :(得分:0)

我认为你想要做的事情可以通过TRIGGER实现UPDATE事件的定时AFTER。但触发器可能会很棘手,请谨慎使用它们。还要记住,如果触发器语句由于某种原因失败,实际的UPDATE / INSERT / DELETE也会失败。