本人有下面问题:
经过处理了一批数据之后,要插入table表table结构如下id1
id2
id3
id4
primary key (id1,id2,id3);其中以id1,id2,id3构成唯一性那么我现在处理完一批数据之后,得到来一批sql语句,但是sql语句中不能保证id1,id2,id3的值就唯一,我想在commit之前有没有什么方法先把id1,id2,id3一起相等的sql语句去掉只剩下一条.这样在插入表的时候可以不会因为唯一性而全部rollback。
我自己想了一个办法,就是先建一个table的一样结构的表table1,然后不设置唯一性,插入成功后,删除id1,id2,id3同时相等的数据到只剩一条,最后把table1表中的数据全部插入到table中。不过这样做的话我要改程序。在程序不改前提下,不知道有没有什么方法没有?
谢谢!!!!!!!

解决方案 »

  1.   

    不改程序是不可能的...执行语句就会报错...并不是在commit的时候去检查....commit只是确认的意思...
      

  2.   

    可以考虑用MERGE,当有相同的数据时UPDATE好了。
      

  3.   

    参考一下
    loop
    begin
    insert into ...;
    commit;
    exception
    when DUP_VAL_ON_INDEX then
    null;
    end;
    end loop;
      

  4.   


    -- 3楼的可行,如果不想以这种的方式的话还可以先判断表中是否已经有相同数据
    select count(0) into iNo from table t where ......
    if iNo <> 0 then
      null;
    else 
      insert into ...
    end if; 
      

  5.   

    看我的测试,遇到主键约束的时候,那一行会报错,但是后面的还可以继续插入。oracle在约束出错时不会自动回滚整个事务的,这一点跟 sql server不一样scott@ORA1> desc newtest;
     名称                                                              是否为空? 类型
     ----------------------------------------------------------------- -------- --------------------------------------------
     VCOL                                                              NOT NULL VARCHAR2(10)
     NCOL                                                              NOT NULL NUMBER(10)scott@ORA1> select * from newtest;未选定行scott@ORA1> insert into newtest values('1', 1);已创建 1 行。scott@ORA1> insert into newtest values('2', 2);已创建 1 行。scott@ORA1> insert into newtest values('1', 1);
    insert into newtest values('1', 1)
    *
    第 1 行出现错误:
    ORA-00001: unique constraint (SCOTT.PK_NEWTEST) violated
    scott@ORA1> insert into newtest values('3', 3);已创建 1 行。scott@ORA1> commit;提交完成。scott@ORA1> select * from newtest;VCOL             NCOL
    ---------- ----------
    1                   1
    2                   2
    3                   3scott@ORA1> commit;
      

  6.   

    问题是不是一条,是成批的,如果一条一条来是可以,但是成批进行commit时候,你并不知道表中已经有了那条纪录,也不能判断插入之前存不存在该记录。
      

  7.   

    如果你生成的是个txt.sql脚本的话,直接执行就是了。
      

  8.   

    6楼:1.sql
    ----------------------
    insert into newtest values('1', 1);
    insert into newtest values('2', 2);
    insert into newtest values('1', 1);
    insert into newtest values('3', 3);
    commit;好,批量执行:
    scott@ORA1> select * from newtest;未选定行scott@ORA1> @c:\1.sql已创建 1 行。
    已创建 1 行。insert into newtest values('1', 1)
    *
    第 1 行出现错误:
    ORA-00001: unique constraint (SCOTT.PK_NEWTEST) violated已创建 1 行。
    提交完成。scott@ORA1> select * from newtest;VCOL             NCOL
    ---------- ----------
    1                   1
    2                   2
    3                   3
      

  9.   

    id1,id2,id3一起相等是什么意思?让我十分费解,半天都没想明白,就假使你要保持你ID的唯一性,写个MERGE的例子吧:MERGE INTO AA 
    USING  BB  --你产生的数据集
    ON (AA.ID= BB.ID)WHEN NOT MATCHED THEN---如果BB中的ID是AA中没有的,则插入
     INSERT
     VALUES (BB.COL1,BB.COL2.....)