我在做项目的时候有这么个需求,我需要对每天产生的16000条数据进行批量的更新修改,
首先我们先在数据表里面查询新的数据条目是否已经在现有的表里存在,如果存在就执行update方法,如果不存在就直接执行insert方法
我的做法就是
for(循环16000条数据){
String sql = "select * from user where userid=? and uname=? and email=?"; 查询是否已经存在
if(不存在){
sql = "insert into user..................." //直接插入
} else{
sql = "update user ,,,,,,, wehre userid = ? and uname = ? and emial = ?" //更新
}
}
这样简单的几条操作,在我一段日子的测试中发现,大概要耗费2个半小时的时间才能执行完这个循环,中途还容易出现错误。
后来上网查询相关信息,来提升效率,终于找到一种可行性方法
采用mysql中的 insert into table(列名1,列名2,列名3 ...) values(值1,值2,值3, ...) on publicate key update 列名1 = values(值1),列名2 = values(值2)...
讲解下这条语句
首先使用这个方法必须满足一个条件,就是你新要查询插入的这16000条数据,与你现有的表数据格式都是一样的,你本地数据表的主键完全与新的数据匹配
因为这个机制建立在数据表主键的基础上,这是它判断是否数据重复的重要依据。
然后讲下update 后面的语句的意思,update后面跟着的列名1 = values(值1),列名2 = values(值2)作用是你想要对那些列的值要进行更新,就将其以这种
组合的方式标记出来例如,userid = values(3),uname = values('xueqi') 这样子
写一条我的语句作为参考:
insert into USER(ID,NAME,PASS,EMAIL,STATUS,SEX,AGE) values(1,'xueqi','123','xeuqi@qq.com',0,1,29),(2,'xiaoli','4521','xiaoli@qq.com',0,1,23) on publicate key update
EMIAL = values(EMAIL),SEX = values(SEX),AGE = values(AGE)