gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:41:21 27 4
gpt4 key购买 nike

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

最佳答案

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

只会插入该行一次。

关于postgresql - Postgres UPSERT - 如果所有数据都相同则不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42187130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com