【问题标题】:How do I reuse Oracle sequence gaps in primary key column?如何在主键列中重用 Oracle 序列间隙?
【发布时间】:2013-03-10 19:49:32
【问题描述】:

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

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

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

【问题讨论】:

  • 更改 Java 部分会更容易,风险也更小。自动递增的主键不是为重复使用而设计的。
  • 您真的要重新编号主表中的 ID 并更改所有从属表中的外键吗?将 int 扩展到 long 似乎更加一致。
  • 我不想更改所有依赖表中的 PK 和外键,而只是拾取并重用间隙范围内的数字。查看我的新更新,谢谢

标签: java oracle architecture oracle11g sequence


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。有转换它需要我这么多的努力。因为我想重用这个差距。我将编写一个函数来查找以保存间隙范围,但如果可以,请告诉 oracle 序列不要使用自动递增,只需使用我分配给它的数字即可。所以即使在 Java 代码中使用 findNextNumber 来调用序列。序列能够返回我分配给它的值。这似乎是不可能的,对吧?有什么选择吗?
  • 这些空白要多久才能再次耗尽?你只是在延长不可避免的事情。您必须在 Java 方面进行更改,其他一切都只是拼凑而成。说真的,在 Java 程序中将 int 更改为 long 可以破坏多少?
  • +1 表示咬紧牙关。任何寻求这些差距的尝试都将耗费大量计算资源,并可能对应用程序的性能产生有害影响。
【解决方案2】:

我肯定会进行更改以使用更长的数字,但与此同时,您可能会设法通过使用生成负数的序列来进行更改。 PK 索引的维护会对性能产生影响,但它会以不成比例的速度增长,尽管

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    相关资源
    最近更新 更多