首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何忽略Postgres中违反外键约束的行?

如何忽略Postgres中违反外键约束的行?
EN

Stack Overflow用户
提问于 2017-02-20 22:53:26
回答 1查看 3.4K关注 0票数 4

在这个sql语句中

代码语言:javascript
运行
复制
INSERT INTO child (parentId, value) SELECT parentId, value FROM temptable

child.parentId是指向parent.id的外键。在运行此长时间运行的parent语句(可插入数百万行)时,可以随时删除INSERT INTO表中的行。

如果child表在parent 中没有对应的外键,则在INSERT INTO语句开始运行之前,或者如果在运行INSERT INTO时,从child引用的parent表中的一行被删除,则我希望INSERT INTO安静地忽略该特定行(并跳过插入到child违反外键约束的行),而不是整个语句失败。

我怎样才能做到这一点?在这种情况下,我不太熟悉任何比赛条件。

EN

回答 1

Stack Overflow用户

发布于 2017-02-20 23:28:06

您可以尝试在SELECT中锁定表SELECT中引用的行。

代码语言:javascript
运行
复制
INSERT INTO child (parent_id, value) 
    SELECT t.parent_id, t.value
    FROM temptable t
    JOIN parent p ON t.parent_id = p.id
    FOR UPDATE OF p;

但是,请注意,当表parent同时被其他事务强烈修改时,这种预防性锁定可能会显著增加执行时间。

作为一种补救措施,您可以考虑在多个事务中执行插入,方法是将数据划分为逻辑分区。

代码语言:javascript
运行
复制
INSERT 
    ...
    WHERE parent_id < 1000

INSERT 
    ...
    WHERE parent_id BETWEEN 1001 AND 2000 -- and so on.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42355651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档