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

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

Решение

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

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

Так

...
SET foo = excluded.foo

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

Другие вопросы по тегам