Triggers 在Oracle10g for ID中自动递增时,如果删除一行,新行是以新序列开始还是从已删除序列继续

Triggers 在Oracle10g for ID中自动递增时,如果删除一行,新行是以新序列开始还是从已删除序列继续,triggers,oracle10g,sequence,auto-increment,Triggers,Oracle10g,Sequence,Auto Increment,我已经在oracle中使用sequence和trigger在我的表上实现了自动增量。 输入的前两条记录具有连续顺序的ID,但在输入第三条记录时,存在间隙。身份证号码是8。删除记录并输入新记录时,ID变为9。 如何消除间隙并将第三条记录的ID设置为3,并按连续顺序设置为下一条记录。 如果删除一行,新行是以新序列开始还是从已删除序列继续? 我如何解决这个问题? 请帮助序列中的间隙永远不会重复使用。无论如何,由于缓存、回滚、RAC等原因,即使没有删除,也应该会出现间隙。如果使用RAC,甚至可能无法按预

我已经在oracle中使用sequence和trigger在我的表上实现了自动增量。 输入的前两条记录具有连续顺序的ID,但在输入第三条记录时,存在间隙。身份证号码是8。删除记录并输入新记录时,ID变为9。 如何消除间隙并将第三条记录的ID设置为3,并按连续顺序设置为下一条记录。 如果删除一行,新行是以新序列开始还是从已删除序列继续? 我如何解决这个问题?
请帮助

序列中的间隙永远不会重复使用。无论如何,由于缓存、回滚、RAC等原因,即使没有删除,也应该会出现间隙。如果使用RAC,甚至可能无法按预期的顺序获得序列。ID,特别是“自动递增”ID,通常是一个合成主键,该键的实际值没有内在意义,它只需是唯一的

当然

如果重新使用间隙,如果添加三条ID为1、2和3的记录,然后删除记录2,会发生什么情况?下一条插入的记录是ID为2还是4?即使您填补了空白(这意味着序列化并基本上忽略序列),那么ID也不是按照插入顺序插入的,因此您仍然无法从查看ID中分辨出任何东西。你不知道,从ID上看,它们是按什么顺序插入的

如果出于显示目的确实需要无缝编号,则可以忽略ID值并使用伪列:

select t.column1, t.column2, ..., 
  row_number() over (order by t.id) as rn
from your_table t;
如果需要跟踪它们插入的顺序,请添加时间戳字段,并在触发器中将其设置为
sys\u timestamp
。然后,您可以按照该顺序生成一个无缝编号:

select t.column1, t.column2, ..., 
  row_number() over (order by t.inserted) as rn
from your_table t;