数据库批量更新(MysqlUpdate批量更新的几种方式)
这篇文章给大家聊聊关于数据库批量更新,以及MysqlUpdate批量更新的几种方式对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
C# 数据库批量更新问题
有一个办法,可能是你想要的。但是不保证一定能实现你的目的。
在C#中有一个SqlCommandBuilder类,该类用来批量自动更新表数据变化,
说是自动更新,其实是根据已知的select语句,来自动生成其他的update,delete语句。
我以前项目的sqlhelper中,用这个类自定义过批量更新方法,在winform中使用一切ok。方法发你,看有用没。
有些细节一定要注意的是,表状态决定表数据的操作,比如表某行状态是修改,那么SqlCommandBuilder会执行update。但是这个状态你要控制好。另外,你传递的select语句,一定要和你所构造的表结构接近吻合。看方法。
///<summary>
/// operare database by commandbuilder
///</summary>
///<param name="connectinString">connectinString</param>
///<param name="commandString">commandString</param>
///<param name="sourceDable">do update or insert database table</param>
public static int ExecuteByCommandBuilder(string connectinString, string commandString, DataTable sourceDable, SqlParameter sqlparam)
{
SqlConnection sqlcon= new SqlConnection();
sqlcon.ConnectionString= connectinString;
using(SqlCommand sqlcommand= new SqlCommand(commandString, sqlcon))
{
if(sqlparam!= null)
{ sqlcommand.Parameters.Add(sqlparam);}
SqlDataAdapter da= new SqlDataAdapter();
da.SelectCommand= sqlcommand;
//DataSet ds= new DataSet();
//da.Fill(ds);
//ds.Tables[0].Merge(sourceDable, false);
SqlCommandBuilder sqlcommandbuilder= new SqlCommandBuilder(da);
return da.Update(sourceDable);
}
}
如何实现sqlbulkcopy 批量更新
由于要录入大量的数据,使用sqlcommand.executenonquery()方法向数据库中插入数据,使得程序运行缓慢,无法满足程序使用要求,就在考虑什么方法能够进行数据的批量处理,最后发现了另外两种性能优异的方法,解决了速度的问题。那么现在就介绍一下两种方法,一种是SqlDataAdapter的Update(dataTable)方法,另一种是SqlBulkCopy类。
MysqlUpdate批量更新的几种方式
通常情况下,我们会使用以下SQL语句来更新字段值:
UPDATE mytable SET myfield='value' WHERE other_field='other_value';
但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的python程序示例:
for x in xrange(10):
sql=''' UPDATE mytable SET myfield='value' WHERE other_field='other_value';'''
这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。幸运的是,还有更好的解决方案,只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下:
UPDATE mytable
SET myfield= CASE other_field
WHEN 1 THEN'value'
WHEN 2 THEN'value'
WHEN 3 THEN'value'
END
WHERE id IN(1,2,3)
这样的SQL语句是很容易理解的,也就是用到了很多编程语言都有的关键字 CASE,根据id字段值来进行不同分支的当型判断,
如果你需要更新一行记录的多个字段,可以用以下SQL语句:
UPDATE categories
SET display_order= CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title= CASE id
WHEN 1 THEN'New Title 1'
WHEN 2 THEN'New Title 2'
WHEN 3 THEN'New Title 3'
END
WHERE id IN(1,2,3)
以上方案大大减少了数据库的查询操作次数,大大节约了系统资源
不过这个有个缺点:要注意的问题是SQL语句的长度,需要考虑程序运行环境所支持的字符串长度,当然这也可以更新mysql的设置来扩展。
当然python这么强大的语言还给我们提供了executemany这么强大的方法,它不仅可以插入数据当然也可以用于更新数据作为一个经常搞事情的人这些东西要经常相互用下才可以对比出结果
update_sql=''' UPDATE mayi_order_image
set order_city=%s
where user_ip=%s and dt=%s and id=%s
and user_ip is not null and(order_city is null or order_city='')
'''
pp= []
for x in xrange(len(result)):
ip= result[x][0]
id_= result[x][1]
add= dbip.lookup(str(ip))
adds= add.split('\t')
address= str(adds[0])+','+str(adds[1])+','+ str(adds[2])
pp.append((address,ip,end,id_))
if x%5000== 0:
saveLog_many(update_sql,pp)
pp= []
saveLog_many(update_sql,pp)
是不是这个更方便一些但是吗速度问题我感觉可以和第二种结合一下对比一下会更好呢
java多线程更新数据库批量的数据信息吗怎么实现
//将数据库中的数据条数分段
public void division(){
//获取要导入的总的数据条数
String sql3="SELECT count(*) FROM [CMD].[dbo].[mycopy1]";
try{
pss=cons.prepareStatement(sql3);
rss=pss.executeQuery();
while(rss.next()){
System.out.println("总记录条数:"+rss.getInt(1));
sum=rss.getInt(1);
}
//每30000条记录作为一个分割点
if(sum>=30000){
n=sum/30000;
residue=sum%30000;
}else{
residue=sum;
}
System.out.println(n+""+residue);
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
线程类
public MyThread(int start,int end){
this.end=end;
this.start=start;
System.out.println("处理掉余数");
try{
System.out.println("--------"+Thread.currentThread().getName()+"------------");
Class.forName(SQLSERVERDRIVER);
System.out.println("加载sqlserver驱动...");
cons= DriverManager.getConnection(CONTENTS,UNS,UPS);
stas= cons.createStatement();
System.out.println("连接SQLServer数据库成功!!");
System.out.println("加载mysql驱动.....");
Class.forName(MYSQLDRIVER);
con= DriverManager.getConnection(CONTENT,UN,UP);
sta= con.createStatement();
//关闭事务自动提交
con.setAutoCommit(false);
System.out.println("连接mysql数据库成功!!");
} catch(Exception e){
e.printStackTrace();
}
// TODO Auto-generated constructor stub
}
public ArrayList<Member> getAll(){
Member member;
String sql1="select* from(select row_number() over(order by pmcode) as rowNum,*"+
" from [CMD].[dbo].[mycopy1]) as t where rowNum between"+start+" and"+end;
try{
System.out.println("正在获取数据...");
allmembers=new ArrayList();
rss=stas.executeQuery(sql1);
while(rss.next()){
member=new Member();
member.setAddress1(rss.getString("address1"));
member.setBnpoints(rss.getString("bnpoints"));
member.setDbno(rss.getString("dbno"));
member.setExpiry(rss.getString("expiry"));
member.setHispoints(rss.getString("hispoints"));
member.setKypoints(rss.getString("kypoints"));
member.setLevels(rss.getString("levels"));
member.setNames(rss.getString("names"));
member.setPmcode(rss.getString("pmcode"));
member.setRemark(rss.getString("remark"));
member.setSex(rss.getString("sex"));
member.setTelephone(rss.getString("telephone"));
member.setWxno(rss.getString("wxno"));
member.setPmdate(rss.getString("pmdate"));
allmembers.add(member);
// System.out.println(member.getNames());
}
System.out.println("成功获取sqlserver数据库数据!");
return allmembers;
} catch(SQLException e){
// TODO Auto-generated catch block
System.out.println("获取sqlserver数据库数据发送异常!");
e.printStackTrace();
}
try{
rss.close();
stas.close();
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void inputAll(ArrayList<Member> allmembers){
System.out.println("开始向mysql中写入");
String sql2="insert into test.mycopy2 values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try{
ps=con.prepareStatement(sql2);
System.out.println("-------------------------等待写入数据条数:"+allmembers.size());
for(int i=0;i<allmembers.size();i++){
ps.setString(1, allmembers.get(i).getPmcode());
ps.setString(2, allmembers.get(i).getNames());
//System.out.println(allmembers.get(i).getNames());
ps.setString(3, allmembers.get(i).getSex());
ps.setString(4, allmembers.get(i).getTelephone());
ps.setString(5, allmembers.get(i).getAddress1());
ps.setString(6, allmembers.get(i).getPmdate());
ps.setString(7, allmembers.get(i).getExpiry());
ps.setString(8, allmembers.get(i).getLevels());
ps.setString(9, allmembers.get(i).getDbno());
ps.setString(10, allmembers.get(i).getHispoints());
ps.setString(11, allmembers.get(i).getBnpoints());
ps.setString(12, allmembers.get(i).getKypoints());
ps.setString(13, allmembers.get(i).getWxno());
ps.setString(14, allmembers.get(i).getRemark());
//插入命令列表
//ps.addBatch();
ps.executeUpdate();
}
//ps.executeBatch();
con.commit();
ps.close();
con.close();
this.flag=false;
System.out.println(Thread.currentThread().getName()+"--->OK");
} catch(SQLException e){
// TODO Auto-generated catch block
System.out.println("向mysql中更新数据时发生异常!");
e.printStackTrace();
}
}
@Override
public void run(){
// TODO Auto-generated method stub
while(true&&flag){
this.inputAll(getAll());
}
}
好了,关于数据库批量更新和MysqlUpdate批量更新的几种方式的问题到这里结束啦,希望可以解决您的问题哈!