当存在一行时,为什么我的 Postgres DELETE 会删除零行?

Max*_*iel 4 postgresql triggers foreign-keys

我有一个表transaction_metadata,其中一行带有主键:ac98435e-3eb3-11e9-8a32-4713408df551,它显示在 SELECT 语句中。

在事务中,删除它(DELETE FROM transaction_metadata WHERE id = 'ac98435e-3eb3-11e9-8a32-4713408df551')表示删除 0 行。稍后在事务中,删除该transaction_metadata行引用的行由于破坏外键约束而失败。

怎么会这样?为什么DELETE当它存在于 中时会说它删除了 0 行SELECT,并且外键约束说它存在?

Max*_*iel 5

事实证明,问题是我们有一个触发器,每次对一行执行操作时transaction_metadata,我们都会将一行插入transaction_metadata_history记录更改的表中。该表有一个外键约束transaction_metadata,这一定导致 DELETE 不起作用。

作为解决方法,我们关闭了控制台会话的触发器 ( SET session_replication_role = replica;),运行DELETEs,然后重新打开它们 ( SET session_replication_role = DEFAULT;)。