SQL-批量插入和批量更新

5 篇文章 0 订阅

最新总是有人问我sql优化的问题,大部分的原因就是更新实体集合或者更新,因为用的是持久化的框架,例如hibernate,EntityFrmwork,所有这里我总结一下如何在数据库中利用sql进行批量的插入或者更新

批量插入

表结构一样或类似

如果两张表的结构一样,例如一个表的结构和另一个表的结构一样,只是其中一张是临时表,而另一张表是存储数据的表,我们需要进行一次表的迁移的话,我们可以这样。
insert into tb1 需要的列名 select 按照前面写上需要的列名 from tb2

insert into tb1 * select * from tb2

或者

insert into tb1 id,name,address select id,name,address from tb2

普通的批量插入

如果对sql语句不熟悉,或者是持久层的框架,大部分是这么写的

INSERT INTO tb_test(ID,NAME) VALUES(1,'zhangsan');
INSERT INTO tb_test(ID,NAME) VALUES(2,'lisi');
INSERT INTO tb_test(ID,NAME) VALUES(3,'wangwu');

但是按照这种做法,我尝试了一下,一次插入2000条数据,大概需要2分钟,但是如果我们用union all,如下:

INSERT INTO tb_test(ID,NAME)
SELECT 4,'zhangsan'
UNION ALL
SELECT 5,'lisi'
UNION ALL
SELECT 6,'wangwu' ;

同样是2000条数据,union all 方法是12秒。第二种方法是先将我们要插入的数据总结成一张表,然后进行表插入,这样的效果明显是比一个一个的插入快的。

批量更新

我们知道我们跟新一般的跟着条件的,所以例如我们更新一个实体集合的话,我们也是一个一个的更新,同样,如果我们程序中利用for循环来批量更细的话,我们就得重复着,打开数据库,更新,关闭数据库,而且我们的大部分时间都是消耗在打开数据库,关闭数据库上边了,而且批量更新通常需要依据条件来判断更新哪条数据,但是一个sql中只能有一个where,所以union all显然是不行的。
但是我在以前的博客写过case when的写法,大家可以向一下,where就好像我们的if(条件)的“条件”,而他就好像我们的case 的when一样,所以我们可以用case when 来实现多“where”,这样的话就能实现多条记录更新的问题。代码如下:

update tb_test SET name = 'zhangsan' case id 
                        when '1' then 'yi'
                        when '2' then 'er'
                        when '3' then 'san' 
                        end,
                        address='zhongguo'  case sex 
                        when '女' then 'femail'
                        when '男'  then 'mail'
                        end
                        where *****

上边的语句就是当人们的名称是zhangsan的时候就批量更细id为汉语拼音,当人们的居住地址的时候就把他们的性别写成英文。

小结

当然最开始的时候我也没有想到上边的两种方法,但是当我们的程序遇到性能问题的时候,又不得不去做优化,所以希望这篇博客对哪些批量更新和批量插入的有一些帮组,但是这个还有一些问题,就是不能防止sql注入的问题。所以使用要看情况。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值