0

我正在使用 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 代码?

4

1 回答 1

1

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

conflict_action指定替代ON CONFLICT操作。它可以是DO NOTHING,也可以是指定在发生冲突时要执行DO UPDATE的操作的确切细节的子句。UPDATE中的SETandWHERE子句ON CONFLICT DO UPDATE可以使用表名(或别名)访问现有行,并使用特殊excluded访问建议插入的行。

所以

...
SET foo = excluded.foo

解决冲突。

于 2019-06-13T13:50:28.090 回答