Oracle“始终作为标识生成”给出21作为序列值

xggvc2p6  于 2023-03-22  发布在  Oracle
关注(0)|答案(1)|浏览(117)

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
jchrr9hc

jchrr9hc1#

标识列基于序列值 * 在后台 *。序列保证唯一性,但它们返回的值不是/不必是无间隙的。
为什么你觉得21是一个“有问题”的值?它有什么问题?它和其他值一样好。
如果你想在select期间返回无间隙值,那么包括例如row_number解析函数:

select row_number() over (order by id) rn,      --> this
       name
from table1;

并将其呈现给用户。当您必须通过ID访问行时,请将ID留给您自己使用。最终用户并不关心ID。
你说你
我希望按顺序获取值,但这并没有发生
“我想要”没有多大帮助。你为什么想要它?你期望得到什么好处?
有一种方法可以创建无间隙的数字序列,但(据我所知)它需要一些编程。
此外,当你删除一行时,在序列中间的某个地方会有一个问题。然后呢?你会再次得到一个间隙。你会对所有数字重新排序吗?你可以(理论上),但是-如果有外键引用该ID呢?修改主键值很少是一个好主意。
简短地说:不要做任何事情。接受序列是唯一的,可能有间隙,然后继续前进。

相关问题