如果由於任何原因Oracle無法執行以下查詢, supplier_seq會遞增嗎? Oracle的增量序列到底是什麼時候?oracle序列NEXTVAL在查詢執行失敗的情況下的行爲
INSERT INTO suppliers
(supplier_id, supplier_name)
VALUES
(supplier_seq.NEXTVAL, 'Kraft Foods');
如果由於任何原因Oracle無法執行以下查詢, supplier_seq會遞增嗎? Oracle的增量序列到底是什麼時候?oracle序列NEXTVAL在查詢執行失敗的情況下的行爲
INSERT INTO suppliers
(supplier_id, supplier_name)
VALUES
(supplier_seq.NEXTVAL, 'Kraft Foods');
只要調用nextval
,序列就會增加。這個增量永遠不會回滾。價值是「走了」。唯一可以通過序列再次生成該值的情況是,如果序列被設置爲CYCLE
並且它周而復始。
由於任何原因
原因確實問題。
如果因爲語法錯誤或不存在名爲suppliers
表,或者如果用戶沒有特權插入suppliers
然後順序不會增加(因爲NEXTVAL實際上從來不叫,因爲語句失敗執行在前面的步驟中被中止)。
無論查詢是否失敗,Oracle Sequences在所有會話中都被同步遞增,直到被調用時爲止。
但是,如果語句中存在語法錯誤(錯誤的表名,列名等),則由於查詢將不會執行,因此順序將保持不變。
謝謝。同意你的答案。我只記得1被接受。 :) – Raghav 2014-09-23 14:06:30
每當您撥打supplier_seq.NEXTVAL
時,它都會增加。
如果你想插入一個有序列表,你可能會發現你會失敗,錯誤unique constraint violated
。但是,當你第二次嘗試時,這將是成功的,那是因爲序列在你第一次使用時需要檢查。可能的解決方案 這裏之一:
插入之前,執行選擇查詢:
select (you sequence name) from table.
然後,
insert into table value(...).
它將工作。
是的,非常確定'supplier_seq得到遞增'。無論查詢執行如何,oracle中的序列都會由引擎本身增加。 – 2014-09-23 12:48:46