0
0
PostgreSQLquery~10 mins

Conditional INSERT with ON CONFLICT in PostgreSQL - Step-by-Step Execution

Choose your learning style9 modes available
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.
Execution Sample
PostgreSQL
INSERT INTO users(id, name, age)
VALUES (1, 'Alice', 30)
ON CONFLICT (id) DO UPDATE
SET age = EXCLUDED.age
WHERE users.age < EXCLUDED.age;
Insert a user with id=1. If id=1 exists, update age only if new age is greater.
Execution Table
StepActionConflict CheckCondition (WHERE)ResultTable State
1Try insert (1, 'Alice', 30)No existing id=1N/AInsert succeeds[{id:1, name:'Alice', age:30}]
2Try insert (1, 'Alice', 35)Conflict on id=1users.age(30) < EXCLUDED.age(35) is TrueUpdate age to 35[{id:1, name:'Alice', age:35}]
3Try insert (1, 'Alice', 25)Conflict on id=1users.age(35) < EXCLUDED.age(25) is FalseDo nothing[{id:1, name:'Alice', age:35}]
4Try insert (2, 'Bob', 40)No existing id=2N/AInsert succeeds[{id:1, name:'Alice', age:35}, {id:2, name:'Bob', age:40}]
💡 All inserts processed; ON CONFLICT handled updates or skips as per condition.
Variable Tracker
Table StateStartAfter Step 1After Step 2After Step 3After 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}]
Key Moments - 2 Insights
Why does the third insert not update the age even though there is a conflict?
Because the WHERE condition users.age < EXCLUDED.age is false (35 < 25 is false), so the DO UPDATE action is skipped (see execution_table row 3).
What happens if there is no conflict on the unique key?
The row is inserted normally without running the ON CONFLICT action (see execution_table rows 1 and 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the age of user with id=1 after step 2?
A35
B25
C30
D40
💡 Hint
Check the 'Result' and 'Table State' columns at step 2 in the execution_table.
At which step does the insert skip updating due to the WHERE condition being false?
AStep 2
BStep 3
CStep 1
DStep 4
💡 Hint
Look for the row where 'Condition (WHERE)' is false in the execution_table.
If the WHERE condition was removed, what would happen at step 3?
AThe insert would fail with conflict error
BThe row would be deleted
CThe age would update to 25
DNothing would change
💡 Hint
Without WHERE, DO UPDATE always runs on conflict, see step 3 action.
Concept Snapshot
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.
Full Transcript
This example shows how PostgreSQL handles conditional inserts with ON CONFLICT. When inserting a row, if a conflict occurs on a unique key, the database can update the existing row instead of erroring. The update only happens if the WHERE condition is true. Otherwise, the insert is skipped. This lets you insert new data or update existing data only when certain conditions are met, avoiding errors and unwanted overwrites.