0

我使用Oracle序列作为表的主键,在Java应用程序中使用int映射这个主键,现在我发现我的客户已经达到了表中的最大int,甚至序列可以不断增加。但是Java int 不再能够存储它,我不想将Java代码从int更改为long,因为成本非常高。然后我发现客户数据库在 ID 列中有很多很大的空白。有什么办法可以重复使用这些丢失的身份证号码吗?

如果可以在数据库级别执行此操作,例如我可以重新组织此序列以将这些缺失的数字添加到其中,因此无需更改 Java 代码,那么我可以使用这些间隙。它应该很棒。

我将编写一个函数来查找间隙范围,在有了这些数字之后,如果可以的话,我想将它们分配给序列值的池,所以也许从现在开始,它不会使用自动递增,只使用我的数字分配的。在 Java 代码中,我可以继续使用 findNextNumber 来调用序列。但序列将能够返回我分配给它的值。这似乎是不可能的,对吧?有什么选择吗?

4

2 回答 2

3

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

于 2013-03-09T16:07:16.120 回答
0

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

于 2013-03-10T11:49:32.693 回答