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

Posted

技术标签:

【中文标题】oracle 11.2.0.1.0 和 oracle 11.2.0.2.0 在使用序列向表中插入值时的差异【英文标题】:Difference in oracle 11.2.0.1.0 and oracle 11.2.0.2.0 while inserting a value into the table using sequence 【发布时间】:2013-09-05 14:13:20 【问题描述】:

在 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。万分感谢!

【问题讨论】:

I understand the reason for id=2 is due to deferred_segment_creation你为什么这么认为? 表和序列不相关 - 没有依赖关系,除非间接通过触发器,您在此处没有。 Ansd 序列没有段。如图所示,您背靠背运行了三个语句,中间没有任何内容 - 例如,在 11.2.0.1 的情况下,您没有执行 insertrollbackinsert Note 1050193.1 确实说这是预期的延迟段创建。这并不表明行为在以后的版本中发生了变化,但我没有看到它在 11.2.0.3 中以 2 开头,deferred_segment_creation=TRUE 所以它似乎已被“修复”。无论如何,这并不重要 - 由于其他原因,您会在序列中出现间隙,因此您不应该从 1 开始依赖它。 @Murali - 您需要一个 Oracle 支持帐户才能看到它;如果您有,请登录 support.oracle.com,然后搜索该号码。我认为大卫是对的。这似乎表明这是预期的行为,但它显然已更改,并且注释指的是未发布的错误 - 如果他们已修复该错误,那么它似乎不会在任何地方得到承认,所以我认为您不会得到明确的答案。 orawin.info 网站上有 2 篇关于这种情况的好博文:Post1,Post2。 【参考方案1】:

问题可能是由于 NOORDER 是 Oracle 序列的默认设置,尤其是在您运行 RAC 环境时。

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

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

CREATE SEQUENCE m1_id_sq ORDER NOCACHE;

编辑参考上面的cmets:

正如 Alex Poole 在上述 cmets 中所指出的:

“无论如何这都不重要 - 你会在序列中得到间隙 出于其他原因,因此您不应依赖从 1" 开始的它

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

Alex Poole 还指出了一个已知问题:Oracle Note 1050193.1(需要 Oracle 支持帐户)与 deferred_segment_creation=TRUE 的问题相关

ThinkJet 还参考以下文章:

http://orawin.info/blog/2010/04/25/new-features-new-defaults-new-side-effects/ http://orawin.info/blog/2011/11/17/new-defaults-old-side-effects/

【讨论】:

所有带有答案的原因都已在 cmets 中发布。见亚历克斯普尔评论 我确实看到了 cmets,但值得注意的是 RAC 环境的问题,并且 NOORDER 参数是序列的默认值。我还不能将 cmets 添加到默认帖子,否则我会在那里这样做。

以上是关于oracle 11.2.0.1.0 和 oracle 11.2.0.2.0 在使用序列向表中插入值时的差异的主要内容,如果未能解决你的问题,请参考以下文章

Oracle―distinct的用法

oracle拨云见日第9篇之Oracle10.2.0.1升级11.2.0.4.3

oracle11g数据库的安装和 使用Navicat Premium 实现Oracle数据库连接

jboss as 7 无法连接到 oracle 11.2.0.1.0

Oracle安装指南

64位linux下装ORACLE 11g用哪个版本的好?版本如下图: