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

Java 如何重用主键列中的Oracle序列间隙?,java,oracle,architecture,oracle11g,sequence,Java,Oracle,Architecture,Oracle11g,Sequence,我使用Oracle序列作为表的主键,并在Java应用程序中使用int映射这个主键,现在我发现我的客户已经达到了表中int的最大值,即使序列可以不断增加。但是javaint已经不能再存储它了,我不想把Java代码从int改为long,因为代价太大了。然后我发现客户数据库在ID列中有很多大的缺口。我能不能重复使用这些丢失的身份证号码 如果我可以在DB级别这样做,我可以重新组织这个序列,将这些缺失的数字添加到其中,这样就不会改变Java代码,然后我可以使用这些间隙。应该很棒 我将编写一个函数来查找间隙

我使用Oracle序列作为表的主键,并在Java应用程序中使用int映射这个主键,现在我发现我的客户已经达到了表中int的最大值,即使序列可以不断增加。但是javaint已经不能再存储它了,我不想把Java代码从int改为long,因为代价太大了。然后我发现客户数据库在ID列中有很多大的缺口。我能不能重复使用这些丢失的身份证号码

如果我可以在DB级别这样做,我可以重新组织这个序列,将这些缺失的数字添加到其中,这样就不会改变Java代码,然后我可以使用这些间隙。应该很棒


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

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

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

我肯定会做出更改,以便能够使用更长的数字,但在此期间,您可能会进行管理,直到您可以使用生成负数的序列进行更改。PK索引的维护会对性能产生影响,而且它会以更快的速度变得更大,尽管我肯定会做出更改,以便能够使用更长的数字,但在此期间,您可能会进行管理,直到您可以使用生成负数的序列进行更改。PK索引的维护会对性能产生影响,而且它会以不成比例的速度增长,尽管更改Java部分会更容易、风险更小。自动递增主键的设计不允许重复使用。是否确实要在主表中重新编号ID并更改所有依赖表中的外键?将int扩展为long似乎更为一致。我不想更改所有依赖表中的PKs和外键,而只是选择并重用gaps范围中的数字。请参阅我的新更新,感谢使用Java部分将更容易,风险更小。自动递增主键的设计不允许重复使用。是否确实要在主表中重新编号ID并更改所有依赖表中的外键?将int扩展为long似乎更为一致。我不想更改所有依赖表中的PKs和外键,而只是选择并重用gaps范围中的数字。请参阅我的最新更新,谢谢您的回复。要实现这一目标需要我付出巨大的努力。因为我想重复使用这些间隙。我将编写一个函数来查找以保存间隙范围,但如果可以,请告诉oracle序列不要使用自动递增,只使用我分配给它的数字。因此,即使在Java代码中,也可以使用findNextNumber调用序列。sequence能够返回我分配给它的值。这似乎不可能,对吧?还有其他选择吗?距离这些缺口再次消失还有多久?你只是在延长不可避免的事情。您必须在Java方面进行更改,其他一切都是拼凑而成的。说真的,在Java程序中把int改为long能打破多少障碍?+1意味着咬紧牙关。任何试图寻找这些差距的尝试都将在计算上花费巨大,并且可能对应用程序的性能产生有害影响。感谢您的回复。要实现这一目标需要我付出巨大的努力。因为我想重复使用这些间隙。我将编写一个函数来查找以保存间隙范围,但如果可以,请告诉oracle序列不要使用自动递增,只使用我分配给它的数字。因此,即使在Java代码中,也可以使用findNextNumber调用序列。sequence能够返回我分配给它的值。这似乎不可能,对吧?还有其他选择吗?距离这些缺口再次消失还有多久?你只是在延长不可避免的事情。您必须在Java方面进行更改,其他一切都是拼凑而成的。说真的,在Java程序中把int改为long能打破多少障碍?+1意味着咬紧牙关。任何寻找这些差距的尝试都将在计算上花费巨大,并且可能对应用程序的性能产生有害影响。