This topic describes how to use the INSERT ON DUPLICATE KEY UPDATE statement.

Description

When the INSERT ON DUPLICATE KEY UPDATE statement is being executed, AnalyticDB for MySQL first attempts to insert a row of data into a table. If the data to be inserted uses the same primary key as existing data, the value specified in the clause of the INSERT ON DUPLICATE KEY UPDATE statement is used to update an existing row. AnalyticDB for MySQL conforms to the following rules to select statements based on whether the row to be written exists:
  • If the row to be written does not exist, the INSERT statement is executed to insert the row. The number of affected rows is 1.
  • If the row to be written exists, the UPDATE statement is executed to update the existing row. The number of affected rows is 1.

Usage notes

The INSERT INTO ... ON DUPLICATE KEY UPDATE... statement supports equivalent updates but not arithmetic expressions.

Syntax

INSERT INTO table_name[(column_name[, ...])]
[VALUES]
[(value_list[, ...])]
ON DUPLICATE KEY UPDATE
   c1 = v1, 
   c2 = v2,
   ...;

Examples

The student_course table is used in all examples. Execute the following statement to create the student_course table:
CREATE TABLE student_course(
    id bigint,
    user_id bigint,
    nc_id varchar,
    nc_user_id varchar,
    nc_commodity_id varchar,
    course_no varchar,
    course_name varchar,
    business_id varchar,
    PRIMARY KEY(user_id)
) DISTRIBUTED BY HASH(user_id);
Execute the following statement to insert a row of data:
INSERT INTO student_course (`id`, `user_id`, `nc_id`, `nc_user_id`, `nc_commodity_id`, `course_no`, `course_name`, `business_id`)
VALUES(277941, 11056941, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--55', 'kuaiji')
ON DUPLICATE KEY UPDATE
course_name = 'Industrial Accounting Practice V9.0--55',
business_id = 'kuaiji';
Execute the SELECT * FROM student_course; statement. The following query result indicates that a row of data is inserted:
+-------+----------+---------------------+---------------------+---------------------+-----------+---------------------+------------+
| id    | user_id  | nc_id               | nc_user_id          | nc_commodity_id     | course_no | course_name         |business_id |
+-------+----------+---------------------+---------------------+---------------------+-----------+---------------------+------------+
|277941 | 11056941 |1001EE1000000043G2T5 |1001EE1000000043G2TO |1001A5100000003YABO2 |kckm303    |Industrial Accounting Practice V9.0--55 |kuaiji      |
Execute the following statement to insert another row of data into the student_course table:
INSERT INTO student_course(`id`, `user_id`, `nc_id`, `nc_user_id`, `nc_commodity_id`, `course_no`, `course_name`, `business_id`)
VALUES(277942, 11056941, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--66', 'kuaiji')
ON DUPLICATE KEY UPDATE
course_name = 'Industrial Accounting Practice V9.0--66',
business_id = 'kuaiji';
The user_id column is set to 11056941 in both the first and second inserted rows. These two rows use the same primary key. After the preceding statement is executed, only the value of the course_name column in the ON DUPLICATE KEY UPDATE clause is updated to 'Industrial Accounting Practice V9.0--66',business_id = 'kuaiji'. If you execute the SELECT * FROM student_course; statement to view the updated data, the following results are returned:
+-------+----------+---------------------+---------------------+---------------------+-----------+---------------------+------------+
| id    | user_id  | nc_id               | nc_user_id          | nc_commodity_id     | course_no | course_name         |business_id |
+-------+----------+---------------------+---------------------+---------------------+-----------+---------------------+------------+
|277941 | 11056941 |1001EE1000000043G2T5 |1001EE1000000043G2TO |1001A5100000003YABO2 |kckm303    |Industrial Accounting Practice V9.0--66 |kuaiji      |

FAQ

Q: Can I execute the INSERT ON DUPLICATE KEY UPDATE statement to batch insert data by using the Logstash plug-in?

A: Yes, you can execute this statement to batch insert data. When you execute the INSERT ON DUPLICATE KEY UPDATE statement to batch insert data, you need only to add the ON DUPLICATE KEY UPDATE clause after the last VALUES().

For example, you can execute the following statement to insert three rows of data into the student_course table:
INSERT INTO student_course(`id`, `user_id`, `nc_id`, `nc_user_id`, `nc_commodity_id`, `course_no`, `course_name`, `business_id`)
VALUES(277943, 11056941, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--77', 'kuaiji'),
(277944, 11056943, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--88', 'kuaiji'),
(277945, 11056944, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', 'Industrial Accounting Practice V9.0--99', 'kuaiji')
ON DUPLICATE KEY UPDATE
course_name = 'Industrial Accounting Practice V9.0--77',
business_id = 'kuaiji';

For more information about the Logstash plug-in, see Overview.