- 1 1. Introduction
- 2 2. What Is ON DUPLICATE KEY UPDATE?
- 3 3. Basic Usage Examples
- 4 4. Advanced Usage
- 5 5. Cautions and Best Practices
- 6 6. Equivalent Features in Other Databases
- 7 7. Conclusion
- 8 8. FAQ
- 8.1 Q1: Which versions of MySQL support ON DUPLICATE KEY UPDATE?
- 8.2 Q2: Will ON DUPLICATE KEY UPDATE work without a primary key?
- 8.3 Q3: What is the difference between ON DUPLICATE KEY UPDATE and REPLACE statement?
- 8.4 Q4: How can I optimize performance of queries using ON DUPLICATE KEY UPDATE?
- 8.5 Q5: Is it possible to change the duplicate-detection condition?
- 8.6 Q6: What causes a “Duplicate entry” error and how do I deal with it?
- 8.7 Q7: Do triggers affect ON DUPLICATE KEY UPDATE?
- 8.8 Q8: Can the same query be used in other databases?
- 8.9 Summary
1. Introduction
One of the frequent challenges when managing databases is handling “duplicate data processing”. For example, in a system that manages customer information, when registering a new customer you must check whether the data already exists, and if so, update the record. If this is handled manually you may encounter errors or delays.
This is where MySQL’s ON DUPLICATE KEY UPDATE syntax comes into play. By using this feature you can automatically perform the appropriate processing when duplicate data occurs. As a result, efficient data management becomes possible and the burden on developers is reduced.
In this article we will explain the basic syntax of ON DUPLICATE KEY UPDATE, usage examples, advanced utilization methods, and points you must watch. This will enable developers from beginner to intermediate level to use this feature effectively in real-world projects.
2. What Is ON DUPLICATE KEY UPDATE?
In MySQL the “ON DUPLICATE KEY UPDATE” is a convenient syntax that allows you to automatically update the data when an INSERT statement violates a primary key or unique key constraint. With this you can efficiently process both data insertion and update in a single query.
Basic Concept
Normally when you use an INSERT statement to insert data, if a primary key or unique key duplicates you will get an error. However, if you use ON DUPLICATE KEY UPDATE you can achieve the following:
- If the data you attempt to insert is new, the INSERT executes as usual.
- If the data you attempt to insert duplicates existing data, the specified columns are updated.
This enables efficient data operations while avoiding errors.
Basic Syntax
The following is the basic syntax for ON DUPLICATE KEY UPDATE:
INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3)
ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2;table_name: The target table name.column1, column2, column3: The column names into which data is inserted.value1, value2, value3: The values to insert.ON DUPLICATE KEY UPDATE: Specifies the update action if a duplicate occurs.
Operating Conditions
For this syntax to operate, you must have at least one of the following constraints defined on the table:
- PRIMARY KEY: A column with unique values.
- UNIQUE KEY: A column that does not allow duplicates.
Without such constraints present, ON DUPLICATE KEY UPDATE will not function.
Usage Example
As a simple example, consider inserting/updating data in a table that manages user information.
Table Definition
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100) UNIQUE
);Using the INSERT Statement
The following query handles cases where the user ID or email already exists.
INSERT INTO users (id, name, email)
VALUES (1, 'Taro', 'taro@example.com')
ON DUPLICATE KEY UPDATE name = 'Taro', email = 'taro@example.com';- If a user with ID 1 already exists, the
nameandemailvalues are updated. - If it does not exist, a new record is inserted.
3. Basic Usage Examples
In this section we introduce basic usage examples of ON DUPLICATE KEY UPDATE, focusing on single-record processing and multiple-record processing.
Single Record Processing
When inserting a single record, let’s look at an example where if duplicate data exists it is updated.
Table Definition
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
stock INT
);Basic INSERT Statement
The following query inserts data for product ID = 1. If the record exists it updates the stock.
INSERT INTO products (id, name, stock)
VALUES (1, 'Product A', 100)
ON DUPLICATE KEY UPDATE stock = 100;Operation Explanation
- If a record with product ID 1 does not exist, a new record is inserted.
- If it already exists, the
stockcolumn value is updated to100.
Multiple Record Processing
Next we show an example of processing multiple records at once.
Bulk Insert of Multiple Values
The following query inserts multiple product data in bulk.
INSERT INTO products (id, name, stock)
VALUES
(1, 'Product A', 100),
(2, 'Product B', 200),
(3, 'Product C', 300)
ON DUPLICATE KEY UPDATE stock = VALUES(stock);Operation Explanation
VALUES(stock)refers to each record’s insertion value (here 100, 200, 300).- If a product ID already exists, its stock is updated based on the insertion value.
- If not existing, a new record is inserted.
Advanced: Dynamic Value Updates
You can also perform updates dynamically based on existing data. The following example adds to the existing stock.
INSERT INTO products (id, name, stock)
VALUES (1, 'Product A', 50)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock);Operation Explanation
- If a record with product ID 1 already exists, its current
stockis incremented by50. - If not existing, a new record is inserted with
stock = 50.
Summary
- You can efficiently process not only single records but also bulk multiple records.
- By using
VALUES(), you can perform flexible updates using the insertion data.
4. Advanced Usage
By using ON DUPLICATE KEY UPDATE you can go beyond basic insert/update processing to perform flexible data operations. In this section we cover conditional updates, combining with transactions, and other advanced usage.
Conditional Updates
With ON DUPLICATE KEY UPDATE you can update columns conditionally using CASE or IF statements. This enables flexible update logic according to the situation.
Example: Change stock only if below a certain threshold
The following example updates the stock only when it is below a specified number.
INSERT INTO products (id, name, stock)
VALUES (1, 'Product A', 100)
ON DUPLICATE KEY UPDATE stock = CASE
WHEN stock < 50 THEN VALUES(stock)
ELSE stock
END;Operation Explanation
- If a record with product ID 1 exists and its existing
stockis below 50, it is updated to the new value (100). - If its stock is 50 or higher, the update is not applied and the existing value remains.
Utilizing Dynamic Updates
You can perform operations using dynamic calculations and update based on insertion data.
Example: Cumulative data update
The following adds new value to the existing stock.
INSERT INTO products (id, name, stock)
VALUES (2, 'Product B', 50)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock);Operation Explanation
- If a record with product ID 2 already exists, its current
stockis increased by 50. - If it does not exist, a new record is inserted.
Combining with Transactions
By grouping multiple INSERT statements or other data operations within a transaction you can perform complex processing while maintaining data consistency.
Example: Bulk processing with transaction
The following example processes multiple records at once, and rolls back if an error occurs.
START TRANSACTION;
INSERT INTO products (id, name, stock)
VALUES
(1, 'Product A', 100),
(2, 'Product B', 200)
ON DUPLICATE KEY UPDATE stock = VALUES(stock);
INSERT INTO products (id, name, stock)
VALUES
(3, 'Product C', 300)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock);
COMMIT;Operation Explanation
- Multiple queries are executed between
START TRANSACTIONandCOMMIT. - If any query fails, rollback occurs and no changes are applied to the database.
Practical Scenarios of Advanced Usage
Scenario 1: Inventory management for an e-commerce site
When items are purchased on an e-commerce site you might decrease the stock of the purchased product.
INSERT INTO products (id, name, stock)
VALUES (4, 'Product D', 100)
ON DUPLICATE KEY UPDATE stock = stock - 1;Scenario 2: User points system
When updating points for an existing user.
INSERT INTO users (id, name, points)
VALUES (1, 'Taro', 50)
ON DUPLICATE KEY UPDATE points = points + VALUES(points);Summary
- By using
CASEstatements and dynamic updates you can implement complex conditional logic. - By combining transactions you can safely and reliably operate on data while preserving consistency.
- Applied to real-world scenarios, you can achieve efficient data management.

5. Cautions and Best Practices
When using ON DUPLICATE KEY UPDATE, if used incorrectly you may induce unexpected behaviour or performance degradation. In this section we present the points to watch and the best practices for effective usage.
Main Cautions
1. Relationship with AUTO_INCREMENT
- Issue
When a table’s primary key usesAUTO_INCREMENT, using ON DUPLICATE KEY UPDATE may increase the AUTO_INCREMENT value even when no duplicate occurred.
This happens because MySQL reserves a new ID at the time of the INSERT attempt. - Solution
To avoid wasted ID increments even when INSERT fails, make use of a unique key and if needed useLAST_INSERT_ID()to retrieve the latest ID.
INSERT INTO products (id, name, stock)
VALUES (NULL, 'Product E', 50)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock);2. Risk of Deadlock
- Issue
When multiple threads execute ON DUPLICATE KEY UPDATE on the same table simultaneously you may encounter deadlocks. - Solution
- Standardize the execution order of queries.
- If necessary, use table locks (but be aware of performance impact).
- Implement retry logic for deadlock occurrence.
3. Proper Index Design
- Issue
If there is no unique key or primary key, ON DUPLICATE KEY UPDATE will not work. Also, without proper indexing performance may degrade drastically. - Solution
Always define a primary key or unique key on the table, and apply appropriate indexes on columns that are frequently searched or updated.
Best Practices
1. Pre-check the data
- Before the INSERT, use a SELECT statement to check whether the data exists, thereby preventing unintended updates.
SELECT id FROM products WHERE id = 1;2. Use Transactions
- Use transactions to group multiple INSERT or UPDATE statements into one execution. This helps maintain consistency while safe-guarding data operations.
START TRANSACTION;
INSERT INTO products (id, name, stock)
VALUES (1, 'Product A', 100)
ON DUPLICATE KEY UPDATE stock = stock + 50;
COMMIT;3. Minimize updated columns
- By limiting the columns you update you can improve performance and avoid unnecessary data changes.
INSERT INTO products (id, name, stock)
VALUES (1, 'Product A', 100)
ON DUPLICATE KEY UPDATE stock = VALUES(stock);4. Implement Error-Handling
- Prepare error-handling for deadlocks or INSERT failures and implement proper retry or rollback logic.
Summary
- Cautions: Pay attention to AUTO_INCREMENT increase, deadlock risks, and inadequate index design.
- Best Practices: Leverage transactions and error-handling to execute operations safely and efficiently.
6. Equivalent Features in Other Databases
MySQL’s “ON DUPLICATE KEY UPDATE” is a powerful feature enabling efficient data operations. However, this is specific to MySQL. Other database systems provide similar functionality but with different characteristics. In this section we explain by comparing with PostgreSQL and SQLite.
PostgreSQL: ON CONFLICT DO UPDATE
In PostgreSQL the syntax “ON CONFLICT DO UPDATE” corresponds to MySQL’s “ON DUPLICATE KEY UPDATE”. This syntax provides a flexible mechanism that allows you to execute specific processing when duplicate data is detected.
Basic Syntax
INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE
SET column2 = value2;ON CONFLICT (column1): Specifies the duplicate condition (unique key or primary key etc.).DO UPDATE: Specifies the update to execute on duplicate.
Usage Example
Here is an example where for a product table if product ID duplicates, the stock is updated.
INSERT INTO products (id, name, stock)
VALUES (1, 'Product A', 100)
ON CONFLICT (id) DO UPDATE
SET stock = EXCLUDED.stock;EXCLUDED.stock: Refers to the value you attempted to insert.
Characteristics
- Difference vs MySQL
In PostgreSQL you explicitly specify the conflict condition, which means you can handle tables with multiple unique keys more flexibly. - advantages
You can add advanced conditional logic, update only specific columns, and so on.
SQLite: INSERT OR REPLACE / INSERT OR IGNORE
SQLite offers “INSERT OR REPLACE” and “INSERT OR IGNORE”, but these differ somewhat from MySQL or PostgreSQL syntax.
INSERT OR REPLACE
“INSERT OR REPLACE” deletes an existing row if duplicate data exists and then inserts a new row.
Basic Syntax
INSERT OR REPLACE INTO table_name (column1, column2)
VALUES (value1, value2);Usage Example
The following example deletes and reinserts if product ID duplicates.
INSERT OR REPLACE INTO products (id, name, stock)
VALUES (1, 'Product A', 100);Characteristics
- Behaviour difference
Unlike MySQL or PostgreSQL which update existing data, SQLite deletes the existing row and then inserts the new one. - Consideration
Since triggers may fire on delete, you must be careful when triggers are defined.
INSERT OR IGNORE
“INSERT OR IGNORE” ignores the insert if duplicate data exists and does nothing.
Comparison Table
| Database | Syntax | Characteristics |
|---|---|---|
| MySQL | ON DUPLICATE KEY UPDATE | Updates specified columns when duplicate occurs. Concise and efficient. |
| PostgreSQL | ON CONFLICT DO UPDATE | High flexibility for conditional logic. Highly adaptable. |
| SQLite | INSERT OR REPLACE / IGNORE | REPLACE deletes then inserts. IGNORE bypasses errors. |
Summary
- MySQL’s “ON DUPLICATE KEY UPDATE” is characterized by concise and efficient insert-or-update processing.
- PostgreSQL’s “ON CONFLICT DO UPDATE” offers flexibility and advanced control suitable for complex conditions.
- SQLite’s “INSERT OR REPLACE” deletes and reinserts which means trigger implications must be considered.
7. Conclusion
In this article we covered everything from the basic syntax of MySQL’s “ON DUPLICATE KEY UPDATE”, usage examples, cautions, and comparison with other databases. By correctly understanding and mastering this feature, you can make database operations more efficient and improve your application’s performance and reliability.
Benefits of ON DUPLICATE KEY UPDATE
- Efficient data management
- You can execute insertion and update in one query, making processing concise and fast.
- Simplified duplicate-data handling
- You can define clear behaviour for duplicate data, making error handling easier.
- High adaptability
- You can perform dynamic updates and conditional logic enabling flexible processing.
Effective Usage Scenarios
- Inventory management system
- Dynamic updating of product stock.
- User management system
- Add or update user information.
- Points management system
- Add or update user points.
In these scenarios, by using ON DUPLICATE KEY UPDATE you can reduce code volume and improve maintainability.
Reflection on Cautions
- AUTO_INCREMENT concerns
- If your primary key uses
AUTO_INCREMENT, you must beware that IDs may increase even if no duplicate occurred.
- Avoiding deadlocks
- You must carefully design execution order and transaction logic to avoid deadlocks.
- Importance of index design
- By designing appropriate primary/unique keys you avoid errors and improve performance.
Key Points of Comparison with Other Databases
- PostgreSQL’s “ON CONFLICT DO UPDATE” allows flexible conditional logic.
- SQLite’s “INSERT OR REPLACE” deletes first then inserts, so you must watch triggers.
Final Recommendations
- For simple insert-or-update processing, proactively use ON DUPLICATE KEY UPDATE.
- For large-scale data operations or advanced conditional logic, combine transactions and pre-data checks to increase safety.
By using ON DUPLICATE KEY UPDATE appropriately you can not only streamline development but also increase your application’s reliability. Please use the content of this article as a reference and apply it to your own project.
8. FAQ
In this article we provided a lot of information on MySQL’s “ON DUPLICATE KEY UPDATE”. In this section we summarize common questions and their answers to deepen your practical knowledge.
Q1: Which versions of MySQL support ON DUPLICATE KEY UPDATE?
- A1: It is available from MySQL 4.1.0 onwards. However, some features or behaviour may differ depending on version, so we advise checking the official documentation for the version you use.
Q2: Will ON DUPLICATE KEY UPDATE work without a primary key?
- A2: No. ON DUPLICATE KEY UPDATE only works on tables with a primary key or unique key. Therefore make sure you define at least one unique key or primary key when designing your table.
Q3: What is the difference between ON DUPLICATE KEY UPDATE and REPLACE statement?
- A3:
- ON DUPLICATE KEY UPDATE updates specific columns when a duplicate is detected.
- REPLACE deletes the existing record and then inserts a new one. Therefore delete triggers may fire and this may affect data consistency.
Q4: How can I optimize performance of queries using ON DUPLICATE KEY UPDATE?
- A4:
- Proper index design: By setting primary or unique keys properly you speed up duplicate detection.
- Minimize updated columns: By updating only required columns you reduce extra processing.
- Use transactions: By grouping bulk processing you reduce database load.
Q5: Is it possible to change the duplicate-detection condition?
- A5: If you want to change the condition, you must change the unique key or primary key definition. In MySQL you cannot change the internal behavior of ON DUPLICATE KEY UPDATE itself.
Q6: What causes a “Duplicate entry” error and how do I deal with it?
- A6:
- Cause: It occurs when you attempt to insert data that violates a unique key or primary key constraint.
- Remedy:
- Check the table schema and find the column causing duplication.
- Before executing the INSERT, use a SELECT statement to verify if duplicate data exists.
- Use ON DUPLICATE KEY UPDATE correctly to avoid this error.
Q7: Do triggers affect ON DUPLICATE KEY UPDATE?
- A7: Yes, they do. When using ON DUPLICATE KEY UPDATE, both INSERT triggers and UPDATE triggers may fire. You must consider this behavior when designing trigger logic.
Q8: Can the same query be used in other databases?
- A8: Other databases provide similar functionality but the syntax and behaviour differ. For example:
- PostgreSQL: ON CONFLICT DO UPDATE
- SQLite: INSERT OR REPLACE
Always refer to the documentation of the database you are using and adjust accordingly.
Summary
In this FAQ we resolved typical questions regarding “ON DUPLICATE KEY UPDATE”. Especially the causes of error messages and methods to optimize performance are useful in practice. If you encounter problems, use this FAQ as a reference to attempt resolution.
By understanding and using ON DUPLICATE KEY UPDATE you can realize efficient and safe database operations.


