我正在使用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只是避免插入行作为其替代操作”),但它确实如此插入一个新行。
答案 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
只会插入一次。