在insert语句中使用两个.nextval

时间:2012-06-08 11:12:37

标签: oracle10g

我正在使用oracle数据库并遇到两个id_poduct.nextval创建为错误的问题:ORA-00001: unique constraint (SYSTEM.SYS_C004166) violated

这是一把钥匙。要使用all是必需的。我可以在声明中使用2 .nextval吗?

insert all 
   into sale_product values (id_product.nextval, id.currval, 'hello', 123, 1) 
   into sale_product values (id_product.nextval, id.currval, 'hi', 123, 1) 
select * from dual;

2 个答案:

答案 0 :(得分:3)

insert into sale_product
select id_product.nextval, id.currval, a, b, c
from
(
    select 'hello' a, 123 b, 1 c from dual union all
    select 'hi'    a, 123 b, 1 c from dual
);

这不使用insert all语法,但如果只插入同一个表,它的工作方式相同。

答案 1 :(得分:2)

id_product.NEXTVAL INSERT中first的值与second INSERT相同,因此您将获得unique constraint违规。如果删除约束并执行插入,您会注意到重复的值!

唯一的方法是按顺序执行两个批量INSERTS或者有两个不同范围的单独序列,后者需要大量的编码和检查。

create table temp(id  number ,id2 number);

insert all 
   into temp values (supplier_seq.nextval, supplier_seq.currval) 
   into temp values (supplier_seq.nextval, supplier_seq.currval) 
select * from dual;


    ID        ID2
---------- ----------
     2          2
     2          2

<强> Refrence multitable insert语句的子查询不能使用序列 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm#i2080134