PostgreSQL开冲突

时间:2019-03-14 20:59:32

标签: sql postgresql

我的查询有问题,因为它似乎模棱两可。 我需要在表中插入新行,但是如果我插入具有相同编号的项目,则只能更新数量。

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
  )
)

2 个答案:

答案 0 :(得分:0)

您要解决的一般问题的名称为“merge” or “upsert”,因为您要在原子操作中“更新现有行,如果没有现有行则插入新行”。您正确使用PostgreSQL's INSERT … ON CONFLICT (…) DO UPDATE …来解决此问题。

您的特定问题是在更新的情况下如何基于现有字段值设置字段值。 ON CONFLICT子句的PostgreSQL文档解决了这个问题:

  

SET中的WHEREON CONFLICT DO UPDATE子句可以使用表名(或别名)访问现有行,并使用特殊的{{1 }}表。

因此,您的excluded子句可以访问SET表以获得建议的excluded值:

quantity

答案 1 :(得分:0)

bignose的答案包含了解决方案的线索:由于quantityexcluded和原始表的列,因此您必须消除歧义:

... DO UPDATE SET quantity = store.quantity + %s