SQL UPSERT Function

Quick summary: UPSERT inserts a new row or updates an existing row if a conflict occurs (syntax depends on the database).

SQL UPSERT Syntax

INSERT INTO table_name (id, name) VALUES (1, 'name') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name
SQL

SQL UPSERT Basic examples

-- PostgreSQL
INSERT INTO users (email, name)
VALUES ('a@test.com','Alice')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name;
SQL
Output:
Row inserted or updated

Inserts or updates on unique key conflict.

SQL UPSERT Real-world usage

-- MySQL
INSERT INTO users (email, name)
VALUES ('a@test.com','Alice')
ON DUPLICATE KEY UPDATE name = VALUES(name);
SQL
Output:
Row inserted or updated

MySQL-style UPSERT using ON DUPLICATE KEY.

SQL UPSERT Edge cases

INSERT INTO users VALUES ();
SQL
Output:
SQL error

UPSERT still requires valid data.

SQL UPSERT Common mistakes

Assuming UPSERT is standard SQL

Syntax differs between databases.

Incorrect
UPSERT INTO users ...
Correct
INSERT ... ON CONFLICT / ON DUPLICATE KEY

Use database-specific syntax.

SQL UPSERT Frequently Asked Questions

What is UPSERT in SQL?

Insert a row or update it if it already exists.

Use case of UPSERT?

Avoid duplicate records.

Syntax differs by DB?

Yes (ON CONFLICT, MERGE, ON DUPLICATE KEY).

Common mistake?

Wrong conflict target.

Performance?

Efficient with indexes.

Requires unique constraint?

Yes.

Safe?

Yes.

Used in APIs?

Yes.

Alternative?

Manual SELECT + INSERT/UPDATE.

Handles concurrency?

Yes with constraints.

Supported in MySQL?

Yes.

Best practice?

Use proper indexes.

SQL UPSERT Related SQL Keywords