The :insert-or-merge transact form is used when you want to insert rows, but on :unique key conflict,
instead merge the new row into the old one.
Takes a binding form that lets you specialise which cols you want to merge.
;; I want to merge by-id.
(def db (rel/materialize {} [[:from :Customer] [:unique :id]])
;; lets insert a customer, if you do not have a conflict, this is the
;; same as insert
(def db (rel/transact db [:insert-or-merge :Customer :* {:id 42, :name "bob"}]))
;; =>
{:Customer #{{:id 42, :name "bob"}}}
;; lets insert again with a conflict
;; the :* binding means, merge 'all' columns from the new row into the old one
;; you could use a vector to be selective.
(rel/transact db [:insert-or-merge :Customer :* {:id 42, :age 33}])
;; =>
{:Customer #{{:id 42, :name "bob", :age 33}}}
See also :insert-or-replace,
:insert-or-update.
:* all cols[col1, col2..] a subset of colsCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |