如果由于某种原因Oracle无法执行以下查询, supplier_seq 会增加吗?什么时候Oracle增加序列?
INSERT INTO suppliers
(supplier_id, supplier_name)
VALUES
(supplier_seq.NEXTVAL, 'Kraft Foods');
答案 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(...).
它会起作用。