2012-06-08 85 views
2

我使用Oracle數據庫和麪臨的其中兩個id_poduct.nextval創造爲錯誤的問題:ORA-00001: unique constraint (SYSTEM.SYS_C004166) violated使用兩種.nextval在INSERT語句

這是一個主鍵。使用全部是一項要求。我可以在聲明中使用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

id_product.NEXTVALfirst INSERT的值是一樣的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 的多表插入語句的子查詢不能使用序列 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm#i2080134

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語法,但它的工作方式相同,如果你只插入到同一張表中。