我觉得我快疯了,下面是表参数。
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,直到你初始化序列,请帮助。
大概,这并不重要。 你使用一个序列来生成键,因为你实际上并不关心值是什么或者是否有空隙,只关心值是唯一的。 如果不是这样,你就有了另一组问题。
什么是 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;
如果我对你的问题理解正确的话
你不应该使用 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后,你可以在你的表中检查。
您可以在您的表中检查 select member_id from member
您可以查询 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