Mysql插入数据,如果存在此数据,那么就更新这条数据,否则插入数据。
使用 on duplicate key update。
准备工作
建表
create table user_info(id int auto_increment primary key,name varchar(20),user_code varchar(20) unique not null,age int 
);
 
建立了一个表,这个表有主键(id),有唯一键(user_code)。
插入数据
insert into user_info(name,user_code,age) values('king','u_001',22);
insert into user_info(name,user_code,age) values('king2','u_002',24);
insert into user_info(name,user_code,age) values('king3','u_003',25);
 

主键更新
利用主键(id)匹配是否有数据插入更新。
INSERT into user_info(id,name,user_code) values(1,'Tom','i_001') on DUPLICATE key  UPDATE  id=1,name='Tom2',user_code='t_001';INSERT into user_info(id,name,user_code) values(1,'Tom','i_001') on DUPLICATE key  UPDATE name='Tom2',user_code='t_001';# 这两种都可以更新同一条数据。
 
此处根据id=1判断,如果存在id=1的数据,那么就不insert,而是执行update。
如果是依据主键更新,那么唯一键有可以被更新。

 执行后发现是影响了两条数据。
再查看下数据,发现id=1的数据被更新了,并没有新插入一条数据,连user_code也更新了。
 
根据唯一键更新
不传入id,而根据user_code这个唯一键判断是否是匹配的数据,来进行更新。
INSERT into user_info(name,user_code) values('Tom01','t_001') on DUPLICATE key  UPDATE  name='Tom001',user_code='t_0001';
 

 插入是判断user_code=t_001,发现表里面已经有此条数据,那么就执行更新语句,发现唯一键也被更新了。
 
执行插入
INSERT into user_info(name,user_code) values('Tom01','t_002') on DUPLICATE key  UPDATE  name='Tom001',user_code='t_0001';
 

 
 此处执行了插入数据,因为根据user_code=t_002发现数据库并没有这条数据,那么执行insert。
注意项
如果没有id,也不根据唯一键user_code,那么就只会执行插入,而不会有更新。
INSERT into user_info(name,age) values('Tom',22) on DUPLICATE key  UPDATE name='Tom2',age = 23;
 
更新时影响条数,为1.
 
| 操作 | 影响条数 | 
|---|---|
| 插入(insert) | 1 | 
| 更新(update) | 1 | 
| on duplicate key update (插入) | 1 | 
| on duplicate key update (更新) | 2 | 
那么可以想象一下,插入并更新应该是做了delete操作,然后insert新数据,当然这仅仅是猜测。
![[笔记]MySQL 插入导致死锁](https://img-blog.csdnimg.cn/46fd749dfbdf497bb6e115f16107c7ac.png)














