MySQL更新会导致触发但不会改变行

时间:2017-01-27 03:03:54

标签: mysql triggers

我有一个PHP脚本来更新MySQL表中的一行。该表具有触发器设置,可在更新时将值存储在第二个表中。

我发现了一个奇怪的问题,对于特定的行,更新语句不会更改行,但会触发触发器并插入第二个表。我在更新后触发"" - 所以我不知道如何在基表中更新数据,但是在更新后成功触发了#34;"并插入第二个表。

关于什么情况可能导致此问题或在何处进行故障排除的任何想法?

编辑: 为了进一步说明 - UPDATE语句应该改变基表数据,但不是。但是,触发器表目标反映了更改,就像更新已发生一样。触发器表用作日志记录表 - 对于基表的任何更改,数据的快照将通过触发器插入到日志记录表中。我在日志表中看到了更改记录,但基表中没有实际更改。

1 个答案:

答案 0 :(得分:1)

  

对于特定行,update语句不会更改行,但会触发触发器并插入第二个表。

这是正常的。 AFTER UPDATE触发器仍会触发,即使UPDATE未修改该行,因为您尝试SET的数据已存在。

如果你想知道某件事是否发生了变化,你必须对其进行测试。

IF NOT (NEW.c1 <=> OLD.c1) THEN
  /* do stuff */
END IF;

使用NOT ( ... <=> ... )是一个带有反转的无效安全真实性测试。当NOT (NULL <=> 1)回避TRUE时,NULL != 1评估为NULL