Postgres可以默默地忽略列约束冲突吗?

时间:2017-01-06 19:41:50

标签: postgresql rails-postgresql postgres-9.6

我有一个Postgres 9.6表,其中某些列必须是唯一的。如果我尝试插入重复的行,我希望Postgres简单地忽略插入并继续,而不是失败或中止。如果插入包含在事务中,则不应中止事务或影响事务中的其他更新。

我假设有一种方法可以创建如上所述的表格,但我还没想出来。

如果您可以告诉我如何在Rails中执行此操作,可以获得奖励。

1 个答案:

答案 0 :(得分:5)

使用ON CONFLICT clause for INSERT

可以实现这一点
  

可选的ON CONFLICT子句指定了替代操作   提出唯一违规或排除约束违规错误。   对于建议插入的每个单独行,要么插入   收益,或者,如果由仲裁者约束或指数指定   违反了conflict_target,采取了替代的conflict_action。   在冲突时不要简单地避免插入一行作为它   替代行动。

这是一项相对较新的功能,仅在Postgres 9.5之后可用,但对您来说不是一个问题。

这不是您在创建表格时特有的内容,您需要修改每个插入内容。我不知道Rails是如何工作的,但我想你必须手动编写至少部分查询才能做到这一点。

此功能通常也称为UPSERT,如果您想在Rails中寻找集成方式来执行此操作,这可能是一个更好的术语。