使用HugSQL通过ON CONFLICT DO UPDATE一次将多行插入PostgreSQL表中

时间:2019-06-13 13:37:46

标签: postgresql clojure hugsql

我正在使用PostgreSQL,并希望通过INSERT语句一次ON CONFLICT DO UPDATE行多行。

我有这样的东西:

-- :name add-things! :! :n
INSERT INTO my_table (
  p,
  foo
)
VALUES :tuple*:values
ON CONFLICT (p) DO UPDATE
SET my_table.foo = foo

其中p是主键。

我这样称呼:

(add-things! {:values [[1 1] [2 3]]})

但这返回: org.postgresql.util.PSQLException: ERROR: column reference "foo" is ambiguous

使用SET my_table.foo = :foo(带有关键字参数)会导致clojure.lang.ExceptionInfo: Parameter Mismatch: :foo parameter data not found,因为使用:tuple*:values语法时没有关键字参数。

任何想法如何实现这一目标?也许通过在HugSQL查询中使用Clojure代码?

1 个答案:

答案 0 :(得分:1)

这里的问题是在冲突解决方案中仅使用foo。 “插入数据”中有一个foo,而实际表中有一个。您需要以某种方式解决“插入数据”以解决该冲突。 docs中所述的解决方案是:

  

conflict_action指定备用的ON CONFLICT操作。它可以是DO NOTHINGDO UPDATE子句,用于指定发生冲突时执行的UPDATE操作的确切细节。 SET中的WHEREON CONFLICT DO UPDATE子句可以使用表名(或别名)访问现有行,而可以使用特殊的{{1 }}表

所以

excluded

解决了冲突。