我的查询有问题,因为它似乎模棱两可。 我需要在表中插入新行,但是如果我插入具有相同编号的项目,则只能更新数量。
cur.execute(
"""INSERT INTO store VALUES(DEFAULT, %s, %s, %s, %s, %s, %s, %s)
ON CONFLICT (number)
DO UPDATE SET quantity=quantity+%s""",
(
name, producent, model, number, quantity,
warehouse, location, quantity
)
)
答案 0 :(得分:0)
您要解决的一般问题的名称为“merge” or “upsert”,因为您要在原子操作中“更新现有行,如果没有现有行则插入新行”。您正确使用PostgreSQL's INSERT … ON CONFLICT (…) DO UPDATE …
来解决此问题。
您的特定问题是在更新的情况下如何基于现有字段值设置字段值。 ON CONFLICT
子句的PostgreSQL文档解决了这个问题:
SET
中的WHERE
和ON CONFLICT DO UPDATE
子句可以使用表名(或别名)访问现有行,并使用特殊的{{1 }}表。
因此,您的excluded
子句可以访问SET
表以获得建议的excluded
值:
quantity
答案 1 :(得分:0)
bignose的答案包含了解决方案的线索:由于quantity
是excluded
和原始表的列,因此您必须消除歧义:
... DO UPDATE SET quantity = store.quantity + %s