查询执行失败时oracle序列NEXTVAL行为

时间:2014-09-23 12:46:26

标签: sql oracle sequence sql-execution-plan

如果由于某种原因Oracle无法执行以下查询, supplier_seq 会增加吗?什么时候Oracle增加序列?

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

3 个答案:

答案 0 :(得分:2)

无论查询是否失败,Oracle Sequences都会在调用它们时在所有会话中同步递增。

但是,如果语句中存在语法错误(错误的表名,列名等),序列将保持不变,因为查询不会被执行。

答案 1 :(得分:2)

一旦调用nextval,序列就会递增。此增量永远不会回滚。价值是"走了"。唯一可能由序列再次生成此值的情况是,如果序列设置为CYCLE并且它已经包裹。

  

由于某种原因

重要的原因。

如果语句因语法错误或没有名为suppliers的表而失败,或者如果用户没有插入suppliers的权限,则序列将不会递增(因为nextval实际上从未被调用过,因为执行在之前的步骤中被中止了。)

答案 2 :(得分:0)

每当您致电supplier_seq.NEXTVAL时,它都会增加。

如果要插入带序列的表,您可能会发现错误unique constraint violated。但是,当您第二次尝试时,这将是成功的,因为序列需要在您第一次使用时进行检查。 这是一个可能的解决方案:

插入前

,执行选择查询:

select (you sequence name) from table.

,然后,

insert into table value(...).

它会起作用。