40002: transaction_integrity_constraint_violation
PostgreSQL含义
SQL 标准中表示在事务结束时检查的完整性约束于 COMMIT 时被违反的代码。重要:PostgreSQL 实际上不会产生此代码;它在 COMMIT 时以约束自身的代码返回延迟(DEFERRED)约束的违反:外键为 23503,唯一性为 23505。
原因
定义为 DEFERRABLE INITIALLY DEFERRED 的外键或唯一约束在事务的中间步骤中被暂时破坏,且在 COMMIT 时仍未修复;在 PostgreSQL 中这会报告为 23503/23505。例如,以错误的顺序插入相互引用的行且未加修正,就会导致此问题。
解决方法
修正事务逻辑,使所有延迟约束在 COMMIT 之前得到满足(补齐缺失的引用、解决冲突)。必要时在事务中用 SET CONSTRAINTS ... IMMEDIATE 提前检查约束,以便更早发现有问题的步骤。针对相互引用调整插入/更新的顺序。