sqlplus oracle11g为什么当我第一次调用sequence.nextval时,它的值会自动递增?

问题描述 投票:1回答:1

我觉得我快疯了,下面是表参数。

CREATE TABLE member(
member_id number(4,0) not null,
first_name varchar2(25) not null,
last_name varchar2(25) not null,
street varchar2(25) not null,
city varchar2(15) not null,
phone char(11) not null,
valid_date date not null,
balance number not null,
constraint member_pk PRIMARY KEY(member_id));

序列语句

CREATE SEQUENCE member_seq
START WITH 110
INCREMENT BY 1
MinValue 110
MaxValue 999
Nocycle
Cache 50;

我的第一条插入表的语句

INSERT INTO member
VALUES(member_seq.nextval, 'JACK', 'WHITE', '123 MAIN ROAD', 'RALEIGH', '919-7763838', '01-JAN-99', 0);

当我运行select语句检查插入时,序列member_id值是111而不是110,我重新做了整个事情,试图先调用currval,但它不能工作,因为你不能调用currval,直到你初始化序列,请帮助。

sql oracle11g sqlplus
1个回答
1
投票

大概,这并不重要。 你使用一个序列来生成键,因为你实际上并不关心值是什么或者是否有空隙,只关心值是唯一的。 如果不是这样,你就有了另一组问题。

什么是 deferred_segment_creation 设置为? 我猜是设置为 true 所以段不是在创建表的时候创建的。 它是在后续的 insert 运行,这将在内部导致Oracle回滚初始的 insert,创建段,然后重新执行该程序。insert 其中调用 nextval 第二次。 如果是这样,你可以在创建表的时候强制创建段。

CREATE TABLE member(
    member_id number(4,0) not null,
    first_name varchar2(25) not null,
    last_name varchar2(25) not null,
    street varchar2(25) not null,
    city varchar2(15) not null,
    phone char(11) not null,
    valid_date date not null,
    balance number not null,
    constraint member_pk PRIMARY KEY(member_id)
 )
 segment creation immediate;

0
投票

如果我对你的问题理解正确的话

你不应该使用 select member_seq.nextval from dual ; 用于检查当前序列号。甲骨文在内部将序列号增加到下一个。序列号被用完。即使你没有执行 COMMIT 会议期间]

也可以使用下面的查询方式来查询当前的数值。

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

在运行insert .NET后,你可以在你的表中检查。

  1. 您可以在您的表中检查 select member_id from member

  2. 您可以查询 select member_seq.currval from dual ; 这将给出你的当前值。

运行创建表、创建序列和插入后。运行下面的查询,你会得到公平的想法。

select member_id from member;
MEMBER_ID
----------
   110

select member_seq.currval from dual ;
CURRVAL
----------
   110

select member_seq.nextval from dual ; -- increments to next value 
CURRVAL
----------
   111

select member_seq.currval from dual ; -- Since you ran nextval above, sequence incremented 
CURRVAL
----------
   111
© www.soinside.com 2019 - 2024. All rights reserved.