我有一个问题,我希望字段以与时间戳类型字段类似的方式工作,如果记录有其他更改,它只会在更新时更新。
我使用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每个字段的声明,可能会也可能不会更新。
答案 0 :(得分:0)
我认为你想要做的事情可以通过TRIGGER实现UPDATE事件的定时AFTER。但触发器可能会很棘手,请谨慎使用它们。还要记住,如果触发器语句由于某种原因失败,实际的UPDATE / INSERT / DELETE也会失败。