如何捕获Postgres PL / PGSQL中由外键完整性引起的更改?

时间:2016-09-07 11:59:43

标签: database postgresql

例如:表格"user"包含字段idtotal,表格purchase包含user_id(作为"user".id的外键ON UPDATE CASCADEON DELETE CASCADE)和cost

我想对total中的任何更改自动更新purchase(因此total将始终等于给定用户的所有购买总和)。我通过行触发AFTER INSERT OR UPDATE OR DELETE ON purchase来做。从技术上讲,purchase.user_id可能会发生变化,有两种情况:

  1. 此更改是由将"user".id从一个用户更改为另一个用户造成的。在这种情况下,我减少旧用户的total并为新用户增加它。
  2. 此更改是由更改表id中的"user"(以及ON UPDATE CASCADE更改user_id中相应的purchase)引起的。在这种情况下,我不应该通过自己的触发器做任何事情。
  3. 如何在触发器中捕获第二个案例?关于在purchase中删除"user"中的删除问题,存在类似的问题。

1 个答案:

答案 0 :(得分:1)

对于级联DELETE的情况,无所事事;来自UPDATE的触发器的purchase只会执行任何操作,因为"user"中的匹配行不再存在。

要处理UPDATE "user".id,您可以创建一个将BEFORE UPDATE ON "user"设置为0的触发器NEW.total。然后在purchase上的触发器运行后,该值将与之前相同。