如何在主键列中重用Oracle序列间隙?

时间:2013-03-09 15:55:13

标签: java oracle architecture oracle11g sequence

我使用Oracle序列作为表的主键,并在Java应用程序中使用int映射这个主键,现在我发现我的客户已达到表中的最大int,即使序列可以连续增加。但是Java int已经不再能够存储它了,我不希望将Java代码从int更改为long,因为成本非常高。然后我发现客户数据库在ID列中有很多差距。我可以用任何方式重用这些丢失的身份证号码吗?

如果可以在数据库级别执行此操作,我可以重新组织此序列以向其添加这些缺失的数字,因此不会更改Java代码然后我可以使用这些间隙。它应该很棒。

我会写一个函数来找到差距范围,在得到这些数字之后,如果可以,我想将它们分配给序列值的池,所以也许从现在开始,它不会使用自动递增,只需使用我指定的号码。在Java代码中,我可以继续使用findNextNumber来调用序列。但序列将能够返回我分配给它的值。这似乎不可能,对吧?任何替代方案?

2 个答案:

答案 0 :(得分:3)

您的意思是,序列是否会返回一个处于“间隙”范围内的值?我不这么认为,除非你出于某种原因放弃/重新创建它。我想你可以编写一些函数来找到表中的PK间隙,然后将这些间隙范围保存到另一个表中,并使用间隙表“滚动”自己的序列函数。十分难看。试图“恢复”这些差距只是听起来像是为了避免不可避免的绝望尝试 - 您的Java PK数据类型应该与DB数据类型一致。很久以前,我有一个同样的问题,一个VB应用程序有一个类键被定义为16位整数,并且序列超过32K,必须将变量更改为Long。我说,咬紧牙关,进行转换。现在有点痛,以后会为你节省很多痛苦。只是我的意见。

答案 1 :(得分:0)

我肯定会让更改能够使用更长的数字,但与此同时,您可能会管理,直到您可以通过使用生成负数的序列进行更改。 PK指数的维护会对性能产生影响,但它会以更快的速度增长,但