PostgreSQL UPSERT Statement
PostgreSQL UPSERT Statement
The PostgreSQL UPSERT statement is used to insert a new row into a table or update an existing row if a conflict occurs. This statement is essential for ensuring data integrity and avoiding duplicate entries during insert operations.
Syntax
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON CONFLICT (conflict_column)
DO UPDATE SET column1 = EXCLUDED.column1,
column2 = EXCLUDED.column2;
The INSERT statement with ON CONFLICT clause has the following components:
table_name: The name of the table to insert or update data.column1, column2, ...: The columns in the table where the data will be inserted or updated.value1, value2, ...: The values to be inserted into the specified columns.conflict_column: The column on which the conflict is detected.EXCLUDED: A special table representing the row proposed for insertion that conflicts with an existing row.
Example PostgreSQL UPSERT Statement Queries
Let's look at some examples of PostgreSQL UPSERT statement queries:
1. Basic UPSERT Example
INSERT INTO employees (id, first_name, last_name, email)
VALUES (1, 'John', 'Doe', 'john.doe@example.com')
ON CONFLICT (id)
DO UPDATE SET first_name = EXCLUDED.first_name,
last_name = EXCLUDED.last_name,
email = EXCLUDED.email;
This query inserts a new row into the employees table. If a conflict occurs on the id column, it updates the existing row with the values from the proposed insertion.
2. UPSERT with Additional Conditions
INSERT INTO employees (id, first_name, last_name, email, salary)
VALUES (1, 'John', 'Doe', 'john.doe@example.com', 50000)
ON CONFLICT (id)
DO UPDATE SET first_name = EXCLUDED.first_name,
last_name = EXCLUDED.last_name,
email = EXCLUDED.email,
salary = GREATEST(employees.salary, EXCLUDED.salary);
This query inserts a new row into the employees table. If a conflict occurs on the id column, it updates the existing row with the new values, ensuring that the salary column retains the highest value.
Full Example
Let's go through a complete example that includes creating a table, inserting data, and using the UPSERT statement.
Step 1: Creating a Table
This step involves creating a new table named employees to store employee data.
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
salary NUMERIC(10, 2)
);
In this example, we create a table named employees with columns for id, first_name, last_name, email, and salary.

Step 2: Inserting Data into the Table
This step involves inserting some sample data into the employees table.
INSERT INTO employees (id, first_name, last_name, email, salary)
VALUES (1, 'John', 'Doe', 'john.doe@example.com', 50000);
Here, we insert data into the employees table, including values for the id, first_name, last_name, email, and salary columns.

Step 3: Using the UPSERT Statement
This step involves inserting a new row or updating an existing row if a conflict occurs.
INSERT INTO employees (id, first_name, last_name, email, salary)
VALUES (1, 'John', 'Doe', 'john.doe@example.com', 55000)
ON CONFLICT (id)
DO UPDATE SET first_name = EXCLUDED.first_name,
last_name = EXCLUDED.last_name,
email = EXCLUDED.email,
salary = GREATEST(employees.salary, EXCLUDED.salary);
Here, we attempt to insert a new row into the employees table. If a conflict occurs on the id column, it updates the existing row with the new values, ensuring that the salary column retains the highest value.

Conclusion
The PostgreSQL UPSERT statement is a powerful tool for managing insertions and updates in a single operation, ensuring data integrity and preventing duplicate entries. Understanding how to use the UPSERT statement and its syntax is essential for effective database management and data manipulation in PostgreSQL.