Postgres UPSERT - 如果所有数据都相同则不更新?

Postgres UPSERT - don't update if all data the same?

我正在使用 Postgres 9.6。如果 任何东西 不同,我想更新记录,但如果不同,则保持不变。

这是我的 SQL,稍微简化了,因为我的 table 实际上有更多字段(运行 通过 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 avoids inserting a row as its alternative action"),但它确实插入了一个新行。

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

只会插入该行一次。