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

标签 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 在删除指令后有触发器:

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

当我从表 A 中删除行时,该行在 B 中没有连接的行,一切都是正确的。
但是,当我从表 A 中删除行时,该行已连接表 B 中的行,然后 DELETE 语句返回 "Query returned successfully: 0 rows affected"。我必须第二次执行 DELETE 语句,然后最终删除行。在第一次 DELTE 之后,只有连接的行在表 B 中被删除,但在表 A 中被删除的行仍然存在。

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

最佳答案

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

基本上,如果您创建一个触发器,它总是更新被删除的同一行,那么从现在开始您将无法删除任何内容。

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

(抱歉英语不好)

关于sql - 由于级联触发器更新此行,因此未删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654068/

相关文章:

sql - 将列添加到表中,然后在事务内更新它

sql - Laravel 中的 where 子句中的多变量

django - JSONField 和 ArrayField 的区别

页面显示时的Javascript事件?

php - 触发器不起作用 - 在插入之前更改表以添加新列

"x-forwarded-for" header 中的 PHP-Blind SQL 注入(inject)

SQL Server 多值列问题

node.js - sails 连接到postgres

java - spring boot 无法将 spring boot 连接到 postgresql 数据库

mysql - 如果获取表中没有数据,则在插入之前触发触发错误。