本人有下面问题:
经过处理了一批数据之后,要插入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中。不过这样做的话我要改程序。在程序不改前提下,不知道有没有什么方法没有?
谢谢!!!!!!!
经过处理了一批数据之后,要插入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中。不过这样做的话我要改程序。在程序不改前提下,不知道有没有什么方法没有?
谢谢!!!!!!!
loop
begin
insert into ...;
commit;
exception
when DUP_VAL_ON_INDEX then
null;
end;
end loop;
-- 3楼的可行,如果不想以这种的方式的话还可以先判断表中是否已经有相同数据
select count(0) into iNo from table t where ......
if iNo <> 0 then
null;
else
insert into ...
end if;
名称 是否为空? 类型
----------------------------------------------------------------- -------- --------------------------------------------
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;
----------------------
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
USING BB --你产生的数据集
ON (AA.ID= BB.ID)WHEN NOT MATCHED THEN---如果BB中的ID是AA中没有的,则插入
INSERT
VALUES (BB.COL1,BB.COL2.....)