Postgresql

如果列不匹配,則插入行

  • January 28, 2020

我有一個具有唯一標識符的表sidsomecolumn以及其他程序檢測行更改所需的布爾值changed,我insert into ... on conflict (sid) DO UPDATE ...用來插入尚未存在的數據,但我也想更新somecolumn並設置changed為 true,除非somecolumn’ t 匹配排除之一。

讓它更清楚一點

  • 如果sid不存在,插入數據
  • 如果sid存在並且somecolumn匹配排除的`somecolumn,什麼都不做
  • 如果sid存在somecolumn且不匹配,則somecolumn使用新值更新並設置changed為 true

有乾淨的方法嗎?我寧願在不進行多個查詢的情況下執行此操作,我在每個查詢中插入數百個值。

您可以將 WHERE 子句添加到 INSERT … ON CONFLICT 的 UPDATE 部分

insert into the_table (sid, somecolumn)
values (...)
on conflict (sid) do update 
 set somecolumn = excluded.somecolumn, 
     changed = true
where the_table.somecolumn <> excluded.somecolumn;

如果需要處理使用中的 NULLsomecolumn

where the_table.somecolumn is distinct from excluded.somecolumn

引用自:https://dba.stackexchange.com/questions/258321