我有一个Postgres 9.6表,其中某些列必须是唯一的。如果我尝试插入重复的行,我希望Postgres简单地忽略插入并继续,而不是失败或中止。如果插入包含在事务中,则不应中止事务或影响事务中的其他更新。
我假设有一种方法可以创建如上所述的表格,但我还没想出来。
如果您可以告诉我如何在Rails中执行此操作,可以获得奖励。
答案 0 :(得分:5)
使用ON CONFLICT clause for INSERT:
可以实现这一点可选的ON CONFLICT子句指定了替代操作 提出唯一违规或排除约束违规错误。 对于建议插入的每个单独行,要么插入 收益,或者,如果由仲裁者约束或指数指定 违反了conflict_target,采取了替代的conflict_action。 在冲突时不要简单地避免插入一行作为它 替代行动。
这是一项相对较新的功能,仅在Postgres 9.5之后可用,但对您来说不是一个问题。
这不是您在创建表格时特有的内容,您需要修改每个插入内容。我不知道Rails是如何工作的,但我想你必须手动编写至少部分查询才能做到这一点。
此功能通常也称为UPSERT,如果您想在Rails中寻找集成方式来执行此操作,这可能是一个更好的术语。