假設我有一個表,我需要使用新的、更改的和未更改的現有資料的混合進行更新(出于遺留原因,我們不能將它們分成 3 個不同的呼叫)。
最小的示例表是這樣的:
(
id integer,
name text
constraint name_unique
unique,
metadata jsonb,
version integer default 0
);
有 3 種不同的事情需要發生:
- 如果
name不存在,則插入新值(INSERT ... ON CONFLICT (name) ...) - 更新
metadata和凹凸version有1,如果name是已經存在和OLD.metadata <> NEW.metadata< -這是一個我無法與寫下來ON CONFLICT,因為它只是給了我訪問語法(?)NEW值EXCLUDED而不是值在手ROW。 - 跳過更新和版本碰撞,如果
OLD.metadata = NEW.metadata
我目前最好的猜測是轉換jsonb為純文本,看看兩者是否相同,但我不知道是否可以在不必撰寫 aFUNCTION和 a 的情況下做到這一點TRIGGER。
這三件事可以在一個查詢中執行嗎?
uj5u.com熱心網友回復:
您可以EXCLUDED在ON CONFLICT ... DO UPDATE子句中參考新的行版本:
INSERT INTO tab (name, metadata)
VALUES ('obadja', '{"silly": 42}')
ON CONFLICT ON name_unique
DO UPDATE SET metadata = EXCLUDED.metadata,
version = tab.version 1
WHERE tab.metadata IS DISTINCT FROM EXCLUDED.metadata;
uj5u.com熱心網友回復:
我想我已經解決了這個問題。
INSERT
INTO example (id, name, metadata, version)
VALUES (DEFAULT, 'Random', '{}', DEFAULT)
on conflict(name) do
update set
metadata = excluded.metadata,
version = example.version 1
where
example.name = excluded.name and
cast(example.metadata as text) <> cast(excluded.metadata as text);
如果我犯了任何錯誤,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341500.html
