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
只会插入该行一次。
我正在使用 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
只会插入该行一次。