由于级联触发器更新此行,因此未删除行

时间:2011-04-13 18:52:28

标签: sql postgresql triggers cascade sql-delete

我有删除表中具有触发器的行的问题,该触发器调用第二个表的触发器,这会更新第一个表中的行。这是描述:

Table A (id,b_table_count) 
Table B (id,a_table_id_fk)

表A触发BEFORE DELETE,其中包含说明:

BEGIN  
DELETE FROM b where a_table_fk = OLD.id;  
RETURN OLD;  
END;

表B通过指令触发AFTER DELETE:

UPDATE a SET b_table_count = b_table_count-1 WHERE OLD.a_table_id_fk = a.id;  

当我删除表A中没有连接行的行时,一切都是正确的 但是,当我从表A中删除已连接表B中的行的行时,DELETE语句返回“查询成功返回:0行受影响”。我必须第二次执行DELETE语句,然后行最终删除。在第一个DELTE之后,在表B中仅删除了连接的ROWS,但是在表A中删除的行仍然存在。

你有答案吗?我怀疑pgsql不允许更新触发器中被删除的行,但我在pgsql文档中没有找到任何关于它的内容。 解决方案是什么?

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,但只有一张桌子。从给定表中删除行会触发一个触发器(在删除之前),该触发器在同一个表中搜索相关行(按给定条件),如果找到它们,则会更新这些行。现在,如果要使用相同的删除命令删除更新的行,则不会删除它。

所以基本上,如果你创建一个触发器,它总是更新被删除的同一行,你就不能从现在开始删除任何东西。

我不知道这是否是故意的。从某种意义上说,这似乎是合乎逻辑的,这是肯定的。如果更新记录,则该记录与要删除的记录不同。

(抱歉英语不好)

答案 1 :(得分:0)

所以基本上你有一个A - >触发器 - > B - >触发器 - >一种情况,实际上是不正确的设计做的事情,我认为postgres锁定正在执行触发器的行或者一行被锁定但是我不确定postgres的所有内部行为。

所以你可以先尝试DELETE FROM B WHERE a_id =%Row_to_delete_id%然后再 在事务中从WHERE a_id =%Row_to_delete_id%中删除

但我强烈建议您修改触发依赖项