批量导入数据(insert)

本文介绍了一种通过将多条插入语句合并为一条SQL语句的方法来提高数据导入效率的技术。这种方法利用了SELECT FROM DUAL结合UNION来构建动态SQL,有效减少了CPU资源的消耗并提升了插入速度。同时,还提供了一个ID自增长的前触发器实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于导入数据是多条insert会大量占用cpu,并且慢。下面是把多条插入数据写入一条insert语句的方法。仿照insert into select语句,把多条记录通过select from dual和union把数据合并到一个记录集中。sql拼写程序如下:

   String sql = "insert into training_moduleright_info(name,MODELGROUP_ID,status) " ;
   boolean first = true ;
   for(int cur = 0 ; cur < rows ; cur ++) {
    String model = fixnull(sheet.getCell(0,cur).getContents()).trim();
    String module = fixnull(sheet.getCell(1,cur).getContents()).trim();
    if(first) {
     sql += "select '"+module+"',(select a.id from training_modelgroup_info a,training_office_info b where a.office_id = b.id and a.name = '"+model+"' and b.type = '" + type+ "'),'1' from dual" ;
     first = false ;
    }
    else {
     sql += " union select '"+module+"',(select a.id from training_modelgroup_info a,training_office_info b where a.office_id = b.id and a.name = '"+model+"' and b.type = '" + type+ "'),'1' from dual" ;
    }
   }
   out.print("execute sql:"+sql+"<br>");

id由于一般都用序列,所以在拼sql的时候不能直接用.nextval,这样我们需要可以写一个id自增长的前触发器。代码如下:

create or replace trigger autoincrease_moduleright_id
  before insert on training_moduleright_info
  for each row
declare
  v_id varchar2(20) ;
  v_num number ;
begin
  select '000'||to_char(s_moduleright_id.nextval) into v_id from dual;
  v_num := length(v_id);
  select :new.MODELGROUP_ID||substr(v_id,v_num-2,v_num) into :new.id  from dual;
end autoincrease_moduleright_id;

写完后在我的机器上用此方法插入了1000+条数据,只用了0.6秒。速度比1000条insert要快很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值