2014-09-23 123 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(...). 

它将工作。

相关问题