MySQL upsert操作

Aug 20 2019 database

upsert 操作是说如果这条记录存在(含有 unique key 或 primary key 的字段存在)那么就更新,否则就插入一条新的记录。

首先创建一张新表,包含一个主键约束 id

1
2
3
4
CREATE TABLE users(
id int unsigned primary key auto_increment,
name varchar(2) not null
);

然后插入多条数据:

1
INSERT INTO users(name) VALUES ('a'), ('b'), ('c');

如果现在要插入 id 为 2 的记录,那么就会报错:

1
2
mysql> insert users values(2,"test");
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

如果简单改一下,就不会报错了:

1
INSERT INTO users(id, name) values (2, "test") on duplicate key update name="test";

或者将 update 设置为取 values

1
INSERT INTO users(id, name) values (2, "test") on duplicate key update name=VALUES(name);

提示 Query OK, 2 rows affected (0.01 sec)

查看一下数据,确实也更新了:

1
2
3
4
5
6
7
mysql> select * from users where id = 2;
+----+------+
| id | name |
+----+------+
| 2 | test |
+----+------+
1 row in set (0.00 sec)

如果插入一条不会重复 id 的记录的话,就正常 insert 了:

1
INSERT INTO users VALUES(4, 'xiaoming') ON DUPLICATE KEY UPDATE name=VALUES(name);

提示:Query OK, 1 row affected (0.01 sec)