我用的是Postgres9.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 simply避免插入行作为其替代操作”),但它确实插入了一个新行。

最佳答案

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

将只插入行一次。

10-06 00:13