MySQL ForeignKey:在更新时间戳

时间:2017-12-29 18:12:38

标签: mysql foreign-keys

我有一个表ch_img,用于存储包含单元格id, filename, width, height, removed_at的图像。 该表有时会获得宽度和高度的更新,并且永远不会删除行。通过将removed_at单元格从NULL更新为时间戳来处理删除。 我有另一个表ch_services,其中一个外键位于image表格的id的单元格ch_img上。 我现在想要更新image的{​​{1}}单元格时,将ch_services removed_at的单元格设置为NULL。 基本上是一种ch_img,但没有DELETE,有更新。但是当我更新ON DELETE SET NULL的{​​{1}}单元格时,我不想设置为Null。我怎么处理这个?

1 个答案:

答案 0 :(得分:1)

有几种不同的方法来处理这样的任务;您提出问题的方式表明使用trigger符合您的需求。这将允许您编写逻辑,查看ch_img的更改并有条件地更新另一个表。触发器的文档非常好,有很多例子。

您的代码看起来像:

delimiter |

CREATE TRIGGER my_trigger BEFORE UPDATE ON ch_img
  FOR EACH ROW
  BEGIN
    IF NEW.removed_at > 0 THEN
      UPDATE ch_services SET img_id = NULL WHERE img_id = NEW.id;
    END IF;
  END;
|

delimiter ;

但是,有理由不使用您应该考虑的触发器。考虑到您正在秘密隐藏位置编写业务逻辑,远离所有其他代码。很容易忘记触发器或忘记它们甚至存在。

我认为除非性能是一个大问题,否则如果将所有逻辑保存在一个位置,代码将更容易维护。在这种情况下,您可以在代码中编写额外的查询。

还有其他人,我敢肯定,谁会强烈反对我。

触发器肯定会完成工作,但正确的答案取决于处理器毫秒是否比工程师小时更有价值。