这样一个问题:
先创建带主键的表
create table aa(a char(5),b char(5),c char(5),constraint int1 primary key(a,b) using index);
然后插入数据
insert into aa 
select '11111' as a,'22222' as b,'33333' as c from dual 
union all select '11111' as a,'22222' as b,'44444' as c from dual 
union all select '22222' as a,'22222' as b,'44444' as c from dual ;
其中第一第二条违反主键约束的。(插入的都是表,不是一条一条插入的)现在要把违反约束的给忽略掉,其他的插入。
应该怎么写呢?
用异常?游标?
给个详细方法啊 我比较菜

解决方案 »

  1.   

    置为无效
    alter table aa disable constraint int1;
    或者删掉
    alter table aa drop constraint int1;
      

  2.   

    可能没看懂题意
    如果你想忽略掉的话直接分开写就是:
    insert into aa
    select '11111' as a,'22222' as b,'33333' as c from dual;
    insert into aa 
     select '11111' as a,'22222' as b,'44444' as c from dual ;
    insert into aa 
    select '22222' as a,'22222' as b,'44444' as c from dual ; 
      

  3.   

    如果用insert into select 这样的方式写,如果出现违反约束的情况,所有的都rollback,一条也不能插入,应该用游标写才行吧,先用游标取记录,再一条条插入,出现违反约束的情况就不做:
    exception
      when DUP_VAL_ON_INDEX then null;
    end;
    这样能保证违反约束的记录只有一条插入,不过用游标这样做速度会很慢
      

  4.   

    现在要把违反约束的给忽略掉,其他的插入。两条违反约束,都不要:
    insert into aa
    select a,b,max(c) from (
    select '11111' as a,'22222' as b,'33333' as c from dual
    union all select '11111' as a,'22222' as b,'44444' as c from dual
    union all select '22222' as a,'22222' as b,'44444' as c from dual) t group by t.a,t.b having count(*)=1;留一条c最大的:
    insert into aa
    select a,b,max(c) from (
    select '11111' as a,'22222' as b,'33333' as c from dual
    union all select '11111' as a,'22222' as b,'44444' as c from dual
    union all select '22222' as a,'22222' as b,'44444' as c from dual) t group by t.a,t.b;
      

  5.   


    数据库版本?10G以上的话LZ去搜索一下"oracle log error".可以很好的解决这个问题.
    正确数据进目的表,有错误的进日志表.其实这个问题很普遍,特别是做ETL的时候.