如何在 postgresql 中使用 IF ELSE 和 ON CONFLICT 子句?

Rit*_*ani 5 sql postgresql upsert

我有一项气流工作,每天通过 INSERT ON CONFLICT 语句更新表的列。该表包含一个枚举类型的字段,当通过作业插入/更新行时,该字段updated_mode设置为自动;如果手动完成,则手动插入/更新行。updated_mode现在,我希望我的工作仅在设置为automatic时才更新行。我怎样才能做到这一点?

基本上,我想做类似的事情:

Insert into table (data) values (data) on conflict (fields) if updated_mode=automatic set data=excluded.data else do nothing
Run Code Online (Sandbox Code Playgroud)

Ale*_* Yu 6

您需要WHERE中的子句ON CONFLICT

INSERT INTO table_data 
VALUES (data) 
  ON CONFLICT (fields) 
  DO UPDATE SET  data=excluded.data 
  WHERE EXCLUDED.updated_mode='automatic'
Run Code Online (Sandbox Code Playgroud)

看看数据库小提琴:https://www.db-fiddle.com/f/qwRzRSFaJx4KDMYn2GEXTe/1


kof*_*ann 3

您应该使用常规 WHERE 条件。神奇的排除记录将包含现有的冲突记录。像这样的东西:

 Insert into table (data) values (data) 
 on conflict (fields) do update 
   set data=excluded.data 
 WHERE updated_mode=automatic 
   and fields = EXCLUDEED.fields
Run Code Online (Sandbox Code Playgroud)

我假设fields是冲突字段,表名称是data