Использование HugSQL для вставки нескольких строк одновременно в таблицу PostgreSQL с помощью ON CONFLICT DO UPDATE - PullRequest
0 голосов
/ 13 июня 2019

Я работаю с 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.

Есть идеи, как этого добиться?Может быть, используя код Clojure в запросе HugSQL?

1 Ответ

1 голос
/ 13 июня 2019

Проблема здесь заключается в использовании только foo внутри разрешения конфликта. В «данных вставки» есть foo, а в таблице - один. Вам нужно как-то обратиться к «вставить данные», чтобы разрешить этот конфликт. Решение, указанное в документах :

conflict_action указывает альтернативное действие ON CONFLICT. Это может быть либо DO NOTHING, либо предложение DO UPDATE, указывающее точные детали действия UPDATE, которое должно быть выполнено в случае конфликта. Предложения SET и WHERE в ON CONFLICT DO UPDATE имеют доступ к существующей строке, используя имя таблицы (или псевдоним), и к строкам, предлагаемым для вставки, с использованием специальной таблицы excluded .

So

...
SET foo = excluded.foo

разрешает конфликт.

...