Question

I have a table with unique identifier sid, somecolumn and boolean changed that is needed by other program to detect change in row, I'm using insert into ... on conflict (sid) DO UPDATE ... to insert data that's not already in there, but I also want to update somecolumn and set changed to true, only if somecolumn doesn't match excluded one.

to make it bit clearer

  • if sid doesn't exist, insert data
  • if sid exists and somecolumn matches excluded `somecolumn, do nothing

  • if sid exists and somecolumn doesn't match, update somecolumn with new value and set changed to true

is there clean way to do this? I'd prefer to do this without making multiple queries, I'm inserting hundreds of values in each query.

Was it helpful?

Solution

You can add a WHERE clause to the UPDATE part of an INSERT ... ON CONFLICT

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

If you need to deal with NULL values in somecolumn use

where the_table.somecolumn is distinct from excluded.somecolumn
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange
scroll top