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

Can Postgres silently ignore column constraint conflicts?

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

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

如果你能在 Rails 中告诉我如何做,加分加分。

这可以通过 ON CONFLICT clause for INSERT:

The optional ON CONFLICT clause specifies an alternative action to raising a unique violation or exclusion constraint violation error. For each individual row proposed for insertion, either the insertion proceeds, or, if an arbiter constraint or index specified by conflict_target is violated, the alternative conflict_action is taken. ON CONFLICT DO NOTHING simply avoids inserting a row as its alternative action.

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

这不是您在 table 创建时指定的内容,您需要修改每个插入内容。我不知道 Rails 是如何工作的,但我想您至少必须手动编写部分查询才能执行此操作。

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