Использование 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
решает конфликт.