PostgreSQL:事务和外键问题

14
我正在向一个具有序列类型主键的A表中插入一个值。我想使用查询返回的值作为B表的外键,但是我收到了这个错误信息:ERROR: insert or update on table "tb_midia_pessoa" violates foreign key constraint "tb_midia_pessoa_id_pessoa_fkey" DETAIL: Key (id_pessoa)=(30) is not present in table "tb_pessoa". 如何在不启动新事务或删除外键约束的情况下实现这一点呢? 谢谢!Pedro

你能更清楚地解释一下“表A”和“表B”与“tb_midia_pessoa”和“tb_pessoa”的对应关系吗? - Matthew Wood
2个回答

21

8
下面的语句允许非延迟约束直到事务提交才被执行。如果您不想更改外键定义,请使用此选项。
SET CONSTRAINTS ALL DEFERRED;

4
实际上,当前的文档说明非延迟约束不受此语句的影响:在创建时,约束会被赋予三种特性之一:DEFERRABLE INITIALLY DEFERRED(可延迟并初始为延迟状态)、DEFERRABLE INITIALLY IMMEDIATE(可延迟但初始为立即状态)或者 NOT DEFERRABLE(不可延迟)。第三类始终为立即状态,并且不受 SET CONSTRAINTS 命令的影响。前两类以指定模式开始每个事务,但它们的行为可以通过 SET CONSTRAINTS 在事务中进行更改。 - user2847643
你应该在什么时候运行它?在启动事务之后吗? - Matthieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接