我用的是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
将只插入行一次。