题目如标题,大量数据insert 进数据库,发现主键重复,我想用最快的方法获取表中重复那条记录,不知可否用rowid,但不知怎么去获取它,或各位有什么高见请指教一下,谢谢。

解决方案 »

  1.   

    出错时那条数据还没有插入到数据库,获得存在于数据库中的重复记录的rowid好像没什么用吧,而且为此你还需要专门到数据库做一次查询操作。定位到出错的记录位置就可以了吧大批量数据处理的时候,使用forall,比如10000条。
    forall i in 1 .. 10000 save exceptions
       insert into t values(n(i));
    exception when others then
       dbms_output.put_line('Errors count:'||sql%bulk_exceptions.count);
       for i in 1 .. sql%bulk_exceptions.count loop
          dbms_output.put_line('index:' || sql%bulk_exceptions(i).error_index);
          dbms_output.put_line('ecode:' || sql%bulk_exceptions(i).error_code);
       end loop;
    end;类似于这样将错误精确定位到行关于forall,save exceptions和集合在oracle中的使用可以google下。
      

  2.   

    rowid是不会重复的,id也没有设置主键约束吧
    试试
    select * 
    from(select a.*,count(1)over(partition by id)c from table1)
    where c>1建议id使用序列来填充,来避免重复问题
      

  3.   

    我通常是捕获SQL异常,将待插入的数据详细信息打印出来,这样就知道是那条数据没有插进去了。
    如果是主键冲突,一眼就能看出数据库中已存在的记录是那条了。
      

  4.   

    如果是为了数据安全,插入前先判断一下主键是否存在.
    例如:
    if exists(select 1 from tb where 关键字 = 关键字的变量)
       ...
    else
       ...
      

  5.   

    程序利用这个机制达到查重的目的,现在就是要从表中select这条已有记录(做其他用途)。我用proc实现的,不知道有没有方法可以更快的找到这条已有记录?
      

  6.   

    你用proc的话,直接就可以select rowid啊。
      

  7.   


    问题是怎样获取那个表里已有记录的rowid ?
      

  8.   

    获取exception 然后把当条数据返回出来就OK
      

  9.   

    你要那个rowid做什么?不是要返回记录吗?还有,对大表做记录存在性检查,对性能的损失将让你得不偿失。直接采用进攻性编程,捕获exception插入未成功的记录
      

  10.   

    select rowid from table_name where ...
      

  11.   

    既然字段都已经命名为主键了,那肯定就不能够插入重复的数据了。
    解决方法:
    1.你在插入前先查询数据库表中是否存在待插入的主键值
    2.从源头避免主键的重复,建议用oacle的sequence(或自己写个方法生成不重复的id值)。
      

  12.   

    能否略微详细讲讲你说的这个exception怎么实现 ?有个简单的例子就更好了。
      

  13.   

    存储过程伪码:begin
    for()loop
    begin
    insert into tbl values (1,'a','b');
    exception when others then --插入异常,不管什么,记录日志。
    insert into log_temp(tb_name,pk)values('tbl',1,othervalues);
    end;
    end loop;
    end;
      

  14.   


    仅限存储过程,如果您是jdbc的preparedStatement的executeBatch,则此法无效。因目前我还没有试出来executeBatch怎么获取批量ID。
      

  15.   

    我在1楼就给出代码了啊汗如果不太考虑性能,不用bulk collect,就可以在insert语句外层外面加一个begin end,在里面处理exception代码同15楼那样