![](/img/trans.png)
[英]How to do multiple columns update on different where condition using PostgreSQL Upsert Using INSERT ON CONFLICT statement
[英]Using HugSQL to INSERT multiple rows at once into PostgreSQL table with ON CONFLICT DO UPDATE
我正在使用PostgreSQL,並希望使用ON CONFLICT DO UPDATE
語句一次INSERT
多行。
我有這樣的事情:
-- :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代碼?
這里的問題是在沖突解決方案中僅使用foo
。 “插入數據”中有一個foo,而實際表中有一個。 您需要以某種方式解決“插入數據”以解決該沖突。 文檔中所述的解決方案是:
conflict_action
指定了另一種ON CONFLICT
動作。 它可以是DO NOTHING
或DO UPDATE
子句,用於指定發生沖突時要執行的UPDATE
操作的確切詳細信息。ON CONFLICT DO UPDATE
的SET
和WHERE
子句可以使用表名(或別名)訪問現有行,並使用特殊excluded
表訪問建議插入的行 。
所以
...
SET foo = excluded.foo
解決沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.