0
0
PostgreSQLquery~20 mins

Conditional INSERT with ON CONFLICT in PostgreSQL - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
ON CONFLICT Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
query_result
intermediate
2:00remaining
What is the output of this INSERT with ON CONFLICT?

Consider a table users(id SERIAL PRIMARY KEY, username TEXT UNIQUE, score INT). You run this query:

INSERT INTO users (username, score) VALUES ('alice', 10) ON CONFLICT (username) DO UPDATE SET score = users.score + 5 RETURNING score;

Assuming the table initially has a row {id:1, username:'alice', score:7}, what will be the returned score?

PostgreSQL
INSERT INTO users (username, score) VALUES ('alice', 10) ON CONFLICT (username) DO UPDATE SET score = users.score + 5 RETURNING score;
A15
B10
C7
D12
Attempts:
2 left
💡 Hint

ON CONFLICT updates the existing row's score by adding 5 to the current score.

query_result
intermediate
2:00remaining
What happens if ON CONFLICT DO NOTHING is used?

Given the same users table, what will be the result of this query if a user with username 'bob' already exists?

INSERT INTO users (username, score) VALUES ('bob', 20) ON CONFLICT (username) DO NOTHING RETURNING *;
PostgreSQL
INSERT INTO users (username, score) VALUES ('bob', 20) ON CONFLICT (username) DO NOTHING RETURNING *;
AReturns no rows
BReturns the newly inserted row with score 20
CReturns the existing row for 'bob'
DRaises a unique constraint violation error
Attempts:
2 left
💡 Hint

DO NOTHING skips the insert if conflict occurs.

📝 Syntax
advanced
2:00remaining
Which query correctly uses ON CONFLICT to update only if new score is higher?

Choose the correct query that inserts a user or updates the score only if the new score is greater than the existing score.

AINSERT INTO users (username, score) VALUES ('carol', 15) ON CONFLICT (username) DO UPDATE SET score = EXCLUDED.score IF EXCLUDED.score > users.score;
BINSERT INTO users (username, score) VALUES ('carol', 15) ON CONFLICT (username) DO UPDATE SET score = EXCLUDED.score WHERE EXCLUDED.score > users.score;
CINSERT INTO users (username, score) VALUES ('carol', 15) ON CONFLICT (username) DO UPDATE SET score = CASE WHEN EXCLUDED.score > users.score THEN EXCLUDED.score ELSE users.score END;
DINSERT INTO users (username, score) VALUES ('carol', 15) ON CONFLICT (username) DO UPDATE SET score = EXCLUDED.score WHERE users.score < EXCLUDED.score;
Attempts:
2 left
💡 Hint

Use WHERE clause after DO UPDATE to conditionally update.

optimization
advanced
2:00remaining
How to optimize bulk insert with ON CONFLICT for large data?

You want to insert thousands of rows into users with ON CONFLICT to update scores. Which approach is best for performance?

ADelete conflicting rows first, then insert all rows without ON CONFLICT
BInsert rows one by one with ON CONFLICT DO UPDATE in a loop
CUse a single INSERT with multiple VALUES and ON CONFLICT DO UPDATE
DInsert all rows into a temporary table, then run an UPDATE joining temp and users
Attempts:
2 left
💡 Hint

Batch operations reduce overhead.

🧠 Conceptual
expert
2:00remaining
Why does ON CONFLICT DO UPDATE sometimes cause deadlocks?

In concurrent transactions, using ON CONFLICT DO UPDATE can cause deadlocks. What is the main reason?

ABecause conflicting rows are locked in different orders by concurrent transactions
BBecause ON CONFLICT DO UPDATE locks the entire table during insert
CBecause ON CONFLICT DO UPDATE disables indexes causing full scans
DBecause PostgreSQL does not support concurrent inserts with ON CONFLICT
Attempts:
2 left
💡 Hint

Think about row locking order in concurrent updates.