Oracle序列给出21而不是3。我不知道为什么是21而不是其他值。请帮助理解这一点。
更新我把这个序列用于静态引用表,这样id就可以被java代码用来拉取数据,数据应该是按照1,1 + 1,1 +2的顺序依次排列的。
create table table1 (id number(20) generated always as identity, name varchar2(20));
insert into table1(name) values('111');
insert into table1(name) values('222');
select * from table1;
--Output
1 111
2 222
insert into table1(name) values('333');
select * from table1;
21 333 -- problamatic id as 21 generated
1 111
2 222
1条答案
按热度按时间jchrr9hc1#
标识列基于序列值 * 在后台 *。序列保证唯一性,但它们返回的值不是/不必是无间隙的。
为什么你觉得
21
是一个“有问题”的值?它有什么问题?它和其他值一样好。如果你想在
select
期间返回无间隙值,那么包括例如row_number
解析函数:并将其呈现给用户。当您必须通过
ID
访问行时,请将ID
留给您自己使用。最终用户并不关心ID。你说你
我希望按顺序获取值,但这并没有发生
“我想要”没有多大帮助。你为什么想要它?你期望得到什么好处?
有一种方法可以创建无间隙的数字序列,但(据我所知)它需要一些编程。
此外,当你删除一行时,在序列中间的某个地方会有一个问题。然后呢?你会再次得到一个间隙。你会对所有数字重新排序吗?你可以(理论上),但是-如果有外键引用该ID呢?修改主键值很少是一个好主意。
简短地说:不要做任何事情。接受序列是唯一的,可能有间隙,然后继续前进。