2014-09-23 56 views
0

如果由於任何原因Oracle無法執行以下查詢, supplier_seq會遞增嗎? Oracle的增量序列到底是什麼時候?oracle序列NEXTVAL在查詢執行失敗的情況下的行爲

INSERT INTO suppliers 
(supplier_id, supplier_name) 
VALUES 
(supplier_seq.NEXTVAL, 'Kraft Foods'); 
+1

是的,非常確定'supplier_seq得到遞增'。無論查詢執行如何,oracle中的序列都會由引擎本身增加。 – 2014-09-23 12:48:46

回答

2

只要調用nextval,序列就會增加。這個增量永遠不會回滾。價值是「走了」。唯一可以通過序列再次生成該值的情況是,如果序列被設置爲CYCLE並且它周而復始。

由於任何原因

原因確實問題。

如果因爲語法錯誤或不存在名爲suppliers表,或者如果用戶沒有特權插入suppliers然後順序不會增加(因爲NEXTVAL實際上從來不叫,因爲語句失敗執行在前面的步驟中被中止)。

2

無論查詢是否失敗,Oracle Sequences在所有會話中都被同步遞增,直到被調用時爲止。

但是,如果語句中存在語法錯誤(錯誤的表名,列名等),則由於查詢將不會執行,因此順序將保持不變。

+0

謝謝。同意你的答案。我只記得1被接受。 :) – Raghav 2014-09-23 14:06:30

0

每當您撥打supplier_seq.NEXTVAL時,它都會增加。

如果你想插入一個有序列表,你可能會發現你會失敗,錯誤unique constraint violated。但是,當你第二次嘗試時,這將是成功的,那是因爲序列在你第一次使用時需要檢查。可能的解決方案 這裏之一:

插入之前,執行選擇查詢:

select (you sequence name) from table. 

然後,

insert into table value(...). 

它將工作。

相關問題