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新数据,当然这仅仅是猜测。
版权声明:本文为lw18751836671原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。