Concept Flow - Conditional INSERT with ON CONFLICT
Start INSERT
Check if conflict on unique key
Run ON CONFLICT action
End
The database tries to insert a row. If a conflict on a unique key happens, it runs the ON CONFLICT action instead of erroring.
INSERT INTO users(id, name, age) VALUES (1, 'Alice', 30) ON CONFLICT (id) DO UPDATE SET age = EXCLUDED.age WHERE users.age < EXCLUDED.age;
| Step | Action | Conflict Check | Condition (WHERE) | Result | Table State |
|---|---|---|---|---|---|
| 1 | Try insert (1, 'Alice', 30) | No existing id=1 | N/A | Insert succeeds | [{id:1, name:'Alice', age:30}] |
| 2 | Try insert (1, 'Alice', 35) | Conflict on id=1 | users.age(30) < EXCLUDED.age(35) is True | Update age to 35 | [{id:1, name:'Alice', age:35}] |
| 3 | Try insert (1, 'Alice', 25) | Conflict on id=1 | users.age(35) < EXCLUDED.age(25) is False | Do nothing | [{id:1, name:'Alice', age:35}] |
| 4 | Try insert (2, 'Bob', 40) | No existing id=2 | N/A | Insert succeeds | [{id:1, name:'Alice', age:35}, {id:2, name:'Bob', age:40}] |
| Table State | Start | After Step 1 | After Step 2 | After Step 3 | After Step 4 |
|---|---|---|---|---|---|
| users | [] | [{id:1, name:'Alice', age:30}] | [{id:1, name:'Alice', age:35}] | [{id:1, name:'Alice', age:35}] | [{id:1, name:'Alice', age:35}, {id:2, name:'Bob', age:40}] |
INSERT INTO table (columns) VALUES (values) ON CONFLICT (conflict_target) DO UPDATE SET column = value WHERE condition; - Tries to insert row. - If conflict on unique key, runs DO UPDATE. - WHERE filters if update happens. - Else inserts new row normally.