今天在重构以前的代码发现一个效率比较低的SQL,插入一条数据的时候先查询,如果不为空,则进行更新操作,如果为空则插入,则插入。
一,Oracle
merge into emp a
using (select '111' as id,'周文军' as name from dual) b
on (a.id= b.id)
when matched then
update set a.name= b.name
when not matched then
insert (id,name) values(b.id,b.name);
--emp表中有id和name字段,当插入一个id=‘111’,name=‘周文军’的数据时,进行判断
1、如果原表存在id=111的人,则运行update语句。
2、如果表中不存在id=111的人,则运行insert语句。
--解释
将插入的数据放置到b表中,和a表进行匹配,匹配规则Wieusing中的规则,如果匹配成功,则运行uodate,否则运行insert,此写法比先查询再做判断的效率提高很多。
二,mysql
mysql中要求该表存在主键
MySQL中存在insert ignore into语句,用法和插入语句相同,但如果表中已存在该记录的主键,则忽略此插入语句。
MySQL中的存在更新否则插入的语句为replace into,语法同insert into,如
replace into emp (id,name) values('111','周文静');
--解释
前提是id为emp的主键
如果存在id=‘111’的记录,则运行更新语句,否则插入。