我正在使用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代码?
答案 0 :(得分:1)
这里的问题是在冲突解决方案中仅使用foo
。 “插入数据”中有一个foo,而实际表中有一个。您需要以某种方式解决“插入数据”以解决该冲突。 docs中所述的解决方案是:
conflict_action
指定备用的ON CONFLICT
操作。它可以是DO NOTHING
或DO UPDATE
子句,用于指定发生冲突时执行的UPDATE
操作的确切细节。SET
中的WHERE
和ON CONFLICT DO UPDATE
子句可以使用表名(或别名)访问现有行,而可以使用特殊的{{1 }}表。
所以
excluded
解决了冲突。