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

| 我在删除具有触发器的表中的行时遇到问题,该触发器调用第二个表的触发器,后者会更新第一个表中的行。说明如下:
Table A (id,b_table_count) 
Table B (id,a_table_id_fk)
表A的触发器在DELETE 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中没有连接的行,一切都正确。 但是,当我从连接了表B中的行的表A中删除行时,DELETE语句返回\“查询成功返回:0行受影响\”。我必须第二次执行DELETE语句,然后最后删除该行。在第一次DELTE之后,仅已连接的ROWS在表B中被删除,但在表A中被删除的行仍然保留。 你有答案吗?我怀疑pgsql不允许更新触发器中要删除的行,但是我在pgsql文档中没有找到任何有关它的信息。 解决办法是什么?     
已邀请:
我遇到类似的问题,但只有一张桌子。从给定表中删除行会触发一个触发器(在删除之前),该触发器将在同一表中(根据给定条件)搜索相关行,如果找到它们,则这些行将被更新。现在,如果要使用相同的delete命令删除更新的行,则不会删除该行。 因此,基本上,如果您创建一个触发器,该触发器始终更新要删除的同一行,则此后您将无法删除任何内容。 我不知道这是否是故意的。从某种意义上讲,这是肯定的。如果您更新记录,则该记录与用于删除的记录不同。 (对不起,英语不好)     
所以基本上,您有一个A->触发器-> B->触发器->一种情况,这实际上是设计上不正确的事情,我认为postgres锁定正在执行触发器的行,或者A行被锁定,但是我不确定postgres的所有内部行为。 因此您可以先从B WHERE处删除a_id =%Row_to_delete_id%,然后再尝试 从某处删除a_id =%Row_to_delete_id%,在交易中, 但我强烈建议您修改触发器依赖项     

要回复问题请先登录注册