需求:文件批量导入,若有主键重复的原始记录则删除,重新导入。
做法:
1.读取文件的一条记录后,先select库中是否有,有就delete,然后insert;效率太低,文件数据大。
2.直接insert,报主键重复才delete,然后再insert;请问这么做有什么问题?
还有最恰当的优化是什么样的?

解决方案 »

  1.   

    需求:文件批量导入,若有主键重复的原始记录则删除,重新导入。
    从文件导入这样的操作,你要先把文件中的所有记录先导入到一张临时表。导用完成后,用数据库的统一去合并,最后清空临时表;合并时使用  merge 语句,楼主先百度一下,有问题再来追问;
      

  2.   

    先导入一张临时表,再用merge语句来插入表
      

  3.   

    那目前我的主键重复后再删除和插入的做法,有什么不好的影响?因为版本已经UAT了,如果影响不大我就不会回退版本,等下次发布时再修改。
      

  4.   

    用C语言写,嵌入式SQL也可以创建临时表吗?以前就用过增删改差
      

  5.   

    merge into tableA using (select * from dual) as tableB on (tableA.id=tableB.id)
    when matched then update set ...
    when not matched then insert value()
      

  6.   

    可以试试: merge
      

  7.   

    你试试我这条语句 
    DECLARE
      CURSOR csr_data IS
        SELECT *
          FROM A;
    BEGIN
      FOR a IN csr_data
      LOOP
        UPDATE B b
           SET 
           b.列名= a.列名  //这里是需要更新的字段
         WHERE 
        b.列名=a.列名 //判断条件
     ;
      END LOOP;
    END;
      

  8.   

    1, 使用外部表读取文件
    2, 楼主实际要做的操作是UPDATE,所以merge最合适