在 BEFORE DELETE 触发器中更新行
Update row in BEFORE DELETE trigger
简而言之:我需要在 BEFORE DELETE
触发器中更新一行并得到错误:
tuple to be updated was already modified by an operation triggered by the current command
我知道更新将被删除的行没有多大意义,但是...
在我的例子中,我有一个取消订单的功能。它会执行一些操作,包括从订单中清除折扣代码(以便可以再次使用该代码)。我想在BEFORE DELETE
触发器中使用相同的功能(订单删除也是一种取消)。
现在我必须手动调用取消函数然后删除订单。我想避免在不先取消订单的情况下意外删除订单的风险,因此 BEFORE DELETE
触发器是一个显而易见的选择。
有解决办法吗?有什么建议吗?
为什么我不能更新要删除的行?
这是实施造成的限制,使您无法这样做。这与PostgreSQL中“元组可见性”的概念有关。
我会在取消函数中添加一个额外的 boolean
参数 modify_row
,默认为 TRUE
,以确定是否应更新该行。然后,您可以使用 modify_row => FALSE
.
在触发器中调用该函数
简而言之:我需要在 BEFORE DELETE
触发器中更新一行并得到错误:
tuple to be updated was already modified by an operation triggered by the current command
我知道更新将被删除的行没有多大意义,但是...
在我的例子中,我有一个取消订单的功能。它会执行一些操作,包括从订单中清除折扣代码(以便可以再次使用该代码)。我想在BEFORE DELETE
触发器中使用相同的功能(订单删除也是一种取消)。
现在我必须手动调用取消函数然后删除订单。我想避免在不先取消订单的情况下意外删除订单的风险,因此 BEFORE DELETE
触发器是一个显而易见的选择。
有解决办法吗?有什么建议吗?
为什么我不能更新要删除的行?
这是实施造成的限制,使您无法这样做。这与PostgreSQL中“元组可见性”的概念有关。
我会在取消函数中添加一个额外的 boolean
参数 modify_row
,默认为 TRUE
,以确定是否应更新该行。然后,您可以使用 modify_row => FALSE
.