最近在写一个项目,需要批量向数据库插入数据(批处理)。但是遇到一个问题,如果某条数据已存在(主键相同),则全部插入都会失败。所以,我需要找到一个方法 :如果数据不存在,就插入,否则就忽略。
在网上找到一篇文章:
向mysql数据库中添加记录时,经常会遇到这样的情况——这条记录在表中不存在的时候插入,存在的时候就忽略(1);存在的时候更新,不存在的时候插入(2)。
关于(1),在网上找了一下,几乎所有的语句都是这样的:
insert into...select ...not exists...
如:
insert into tb(field1,field2)
select 'aa','bb' from tb
where not exists (select * from tb where field1='aa' );
在我的机器上,刚开始测试的时候没发现问题,但清表之后发现,这条语句什么也不能插入了(空表的时候,插入不进去任何记录)。这时,select 'aa','bb' from tb where not exists (select * from tb where field1='aa' )返回的始终是空。
?表空的时候,select 'aa','bb' from tb where not exists (select * from tb where field1='aa' )总是空;表中有记录,但没有字段field1值为'aa'的记录时,返回 'aa','bb' ?
查了些资料,还没有确定原因。绕了一下,针对这个问题采用临时表解决,sql如下:
insert into tb(field1,field2)
select * from (select 'aa','bb') as t
where (select count(*) from tb where field1='aa' )=0;
一般实现(2)采用的方式为基于表为主键约束的,使用“ON DUPLICATE KEY UPDATE“命令。示例如下:
id为主键,记录的id存在时更新累加字段dealcount的值,不存在时插入。
文章介绍了两种方法,第一种略显复杂,且子查询的效率也是个问题,而且子查询中不能用limit(当然也有解决方法);第二种就不太合适了,因为我要的是忽略而不是更新。
查了下Mysql INSERT的语法,
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
发现有种写法是网上很少有人提到的:“insert ignore into“,这种写法非常简洁,而且完全符和我的要求。
















