使用序列在表中插入值时,oracle 11.2.0.1.0和oracle 11.2.0.2.0的区别

Mur*_*ali 5 oracle oracle11g oracle11gr2

在Oracle 11.2.0.1.0中:

1)我创建了一个表.

create table m1(id number(5,2), version number(5,2), primary key (id));

2)我创建了一个序列.

CREATE SEQUENCE m1_id_sq;

3)我将值插入表中.

insert into m1(id, version) values (m1_id_sq.nextval, 1);

4)输出.

id version

-------------

2 1

*我理解id = 2的原因是由于从11.2.0.1.0开始引入的deferred_segment_creation功能.

*我在oracle中创建了一个用户实例,并运行了上述三个命令.不是作为主人.

现在我按照相同的步骤

在Oracle 11.2.0.2.0中,

但我得到的输出是,

id version

-------------

1 1

请解释为什么oracle 11.2.0.2.0中的id = 1,而oracle 11.2.0.1.0中的id = 2.十分感谢!

Mey*_*rRJ 1

该问题可能是由于 NOORDER 是 Oracle 序列的默认值这一事实造成的,尤其是在运行 RAC 环境时。

http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6014.htm

我了解到,对于序列,如果我想保证它们是连续的,我通常必须在创建序列时添加以下关键字:

CREATE SEQUENCE m1_id_sq ORDER NOCACHE;
Run Code Online (Sandbox Code Playgroud)

编辑参考以上评论:

正如 Alex Poole 在上面的评论中指出的:

“无论如何,这并不重要——你会因为其他原因而在序列中出现间隙,所以你不应该依赖它从 1 开始”

NOORDER 作为序列的默认值解释了这个问题。

Alex Poole 还指出了一个已知问题:与deferred_segment_creation=TRUE.

ThinkJet 还参考了以下文章,这些文章显示早期版本的 Oracle 在序列和延迟段方面存在一些问题:

https://web.archive.org/web/20150914162717/http://orawin.info/blog/2010/04/25/new-features-new-defaults-new-side-effects/

https://web.archive.org/web/20151004175547/http://orawin.info/blog/2011/11/17/new-defaults-old-side-effects/