如果由于任何原因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