使用sequence向表中插入值时oracle 11.2.0.1.0和oracle 11.2.0.2.0中的差异

yduiuuwa  于 2023-05-16  发布在  Oracle
关注(0)|答案(1)|浏览(96)

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)输出。
idversion
-------------
21

  • 我理解id=2的原因是由于从11.2.0.1.0开始引入的deferred_segment_creation功能。
  • 我在oracle中创建了一个用户示例,并运行了上述三个命令。不是作为一个主人。

现在我遵循同样的步骤

在Oracle 11.2.0.2.0中,

但我得到的结果是
idversion
-------------
11
请解释为什么在oracle 11.2.0.2.0中id=1,而在oracle 11.2.0.1.0中id=2。非常感谢!

wqlqzqxt

wqlqzqxt1#

这个问题可能是由于NOORDER是Oracle Sequences的默认值,尤其是在运行RAC环境时。
http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6014.htm
我了解到,使用Sequences,如果我想保证它们是顺序的,我通常必须在创建序列时添加以下关键字:

CREATE SEQUENCE m1_id_sq ORDER NOCACHE;

编辑以参考上述评论:
正如Alex Poole在上面的评论中指出的:
“这应该没有什么关系-你会因为其他原因而在序列中得到空白,所以你不应该依赖它从1开始。
NOORDER作为序列的默认值解释了这个问题。
Alex Poole还指出了一个已知问题:Oracle Note 1050193.1(需要Oracle Support帐户)与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/

相关问题