5

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

我假设有一种方法可以如上所述创建表,但我还没有弄清楚。

如果你能告诉我如何在 Rails 中做到这一点,那就加分。

4

1 回答 1

10

这可以通过INSERT 的 ON CONFLICT 子句实现

可选的 ON CONFLICT 子句指定引发唯一违规或排除约束违规错误的替代操作。对于建议插入的每个单独的行,插入继续进行,或者,如果违反了由冲突目标指定的仲裁约束或索引,则采取替代冲突行动。ON CONFLICT DO NOTHING 只是避免插入一行作为其替代操作。

这是一个相对较新的功能,仅从 Postgres 9.5 开始可用,但这对您来说不是问题。

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

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

于 2017-01-06T19:44:41.113 回答