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)