Postgres UPSERT - 如果所有数据相同,请不要更新?

时间:2017-02-12 11:41:20

标签: postgresql unique upsert

我正在使用Postgres 9.6。我希望更新记录,如果任何有关它的不同,但如果没有则保持相同。

这是我的SQL,略有简化,因为我的表实际上有更多字段(通过psycopg2运行):

query = "INSERT INTO cap(scheme, year, code) "
query += "VALUES(%s, %s, %s) "
query += "ON CONFLICT DO NOTHING"
cursor.execute(query, ('abc', 2015, 'twu'))

但是,如果我使用完全相同的值运行两次,我会在数据库中获得两条记录。

如何修改此查询以便提供完全相同的值不会创建新记录?

我试过阅读ON CONFLICT UPDATE documentation,但不知道如何根据我的情况调整它。特别是,在我看来DO NOTHING不应该插入一行(文档说:“ON CONFLICT DO NOTHING只是避免插入行作为其替代操作”),但它确实如此插入一个新行。

1 个答案:

答案 0 :(得分:4)

INSERT ... ON CONFLICT ...需要一个独特的约束来捕捉冲突,例如

create table cap(
    scheme text, 
    year int, 
    code text, 
    unique(scheme, year, code) -- ! added
);

使用唯一约束多次执行此查询

INSERT INTO cap(scheme, year, code)
VALUES('abc', 2015, 'twu')
ON CONFLICT DO NOTHING

只会插入一次。