MySQL - Upsert



The MySQL UPSERT Operation

The MySQL UPSERT operation combines INSERT and UPDATE into a single statement, allowing you to insert a new row into a table or update an existing row if it already exists. We can understand in the name (UPSERT) itself, where UP stands for UPDATE and SERT stands for INSERT.

This tutorial covers three common methods to perform UPSERT operations in MySQL: INSERT IGNORE, REPLACE, and INSERT with ON DUPLICATE KEY UPDATE.

UPSERT Using INSERT IGNORE

The INSERT IGNORE statement in MySQL allows you to insert a new record into a table. If a record with the same primary key already exists, it ignores the error and doesn't insert the new record.

Example

First, let us create a table with the name COURSES using the following query −

CREATE TABLE COURSES(
   ID int,
   COURSE varchar(50) primary key,
   COST int
);

Here, we are inserting records into the COURSES table −

INSERT INTO COURSES VALUES 
(1, "HTML", 3000),
(2, "CSS", 4000),
(3, "JavaScript", 6000),
(4, "Node.js", 10000),
(5, "React.js", 12000),
(6, "Angular", 8000),
(7, "Php", 9000);

The COURSES table obtained is as follows −

ID COURSE COST
6 Angular 8000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000

Now, we attempt to insert a duplicate record using the INSERT INTO statement in the following query −

INSERT INTO COURSES VALUES (6, 'Angular', 9000);

This results in an error because a duplicate record cannot be inserted −

ERROR 1062 (23000): Duplicate entry 'Angular' for key 'courses.PRIMARY'

Using INSERT IGNORE −

Now, let us perform the same operation using INSERT IGNORE statement −

INSERT IGNORE INTO COURSES VALUES (6, 'Angular', 9000);

Output

As we can see in the output below, the INSERT IGNORE statement ignores the error −

Query OK, 0 rows affected, 1 warning (0.00 sec)

Verification

We can verify the COURSES table to see that the error was ignored using the following SELECT query −

SELECT * FROM COURSES;

The table obtained is as follows −

ID COURSE COST
6 Angular 8000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000

UPSERT Using REPLACE

The MySQL REPLACE statement first attempts to delete the existing row if it exists and then inserts the new row with the same primary key. If the row does not exist, it simply inserts the new row.

Example

Let us replace or update a row in the COURSES table. If a row with COURSE "Angular" already exists, it will update its values for ID and COST with the new values provided. Else, a new row will be inserted with the specified values in the query −

REPLACE INTO COURSES VALUES (6, 'Angular', 9000);

Output

The output for the query above produced is as given below −

Query OK, 2 rows affected (0.01 sec)

Verification

Now, let us verify the COURSES table using the following SELECT query −

SELECT * FROM COURSES;

We can see in the following table, the REPLACE statement added a new row after deleting the duplicate row −

ID COURSE COST
6 Angular 9000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000

UPSERT Using INSERT with ON DUPLICATE KEY UPDATE

The INSERT ... ON DUPLICATE KEY UPDATE statement in MySQL attempts to insert a new row. If the row already exists, it updates the existing row with the new values specified in the statement.

Example

Here, we are updating the duplicate record using the following query −

INSERT INTO COURSES VALUES (6, 'Angular', 9000)
ON DUPLICATE KEY UPDATE
ID = 6, COURSE = 'Angular', COST = 20000;

Output

As we can see in the output below, no error is generated and the duplicate row gets updated.

Query OK, 2 rows affected (0.01 sec)

Verification

Let us verify the COURSES table using the following SELECT query −

SELECT * FROM COURSES;

As we can see the table below, the INSERT INTO... ON DUPLICATE KEY UPDATE statement updated the duplicate record −

ID COURSE COST
6 Angular 20000
2 CSS 4000
1 HTML 3000
3 JavaScript 6000
4 Node.js 10000
7 Php 9000
5 React.js 12000
Advertisements