数据准备

on duplicate key update

insert into test_table(id,username)
values(4,'fukaiit')
on duplicate key update username='fukaiit'

执行如上sql,该id不存在(此处id不存在,指的是id为x的记录不存在,包括主键、unique索引列等情况),相当于执行了insert部分,普通插入,受影响的行:1。

insert into test_table(id,username)
values(1,'fukaiit')
on duplicate key update username='fukaiit'

执行如上sql,该id已存在,相当于执行了update部分,受影响的行:2。

执行结果如下,注意只是更新username,是保留了email的。

replace into … values…

replace into test_table(id,username)
values(5,'fukaiit');

执行如上sql,该id不存在,相当于执行了insert,普通插入,受影响的行:1。

replace into test_table(id,username)
values(1,'fukaiit');

执行如上sql,该id已存在,相当于执行了删除再插入的操作,受影响的行:2。

执行结果如下,注意删除后再插入是没有email值的,所以此时email为null,注意与on duplicate key update的区别。

无论是insert on duplicate key update还是replace into,在插入时mysql返回的影响行数就是插入的记录数,但是在更新时返回的影响行数是更新行数*2。

insert ignore into … values…

insert ignore into test_table(id,username) 
values(6,'fukaiit');

执行如上sql,该id不存在,相当于执行了insert,普通插入,受影响的行:1。

insert ignore into test_table(id,username) 
values(1,'fukaiit_new');

执行如上sql,该id已存在,忽略了该插入操作,数据没有变化,受影响的行:0。

使用dual虚表和not exists

该方法与insert ignore into … values…方法的效果相同。

insert into test_table(id,username)
select 7,'fukaiit' from dual 
where not exists (select * from test_table where id=7);

执行如上sql,该id不存在,select子句返回结果集为空,not exists成立,相当于执行了insert,普通插入,受影响的行:1。

insert into test_table(id,username)
select 2,'fukaiit' from dual 
where not exists (select * from test_table where id=2);

执行如上sql,该id已存在,select子句返回结果集不为空,not exists不成立,则未执行插入操作,数据没有变化,受影响的行:0。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。