-8

我在Java应用程序中使用int作为PK,现在它已经达到了最大int值(20亿),即使在DB中它也可以存储比它更多的数字。但是 java int 只能容纳大约 20 亿。

我无法将 int 更改为 long 以与 DB 对齐。因为这是巨大的努力。

除了这个,有人有什么办法吗?

4

6 回答 6

6

Java 中整数的最大值为 2,147,483,647。如果您需要更大的数字,则必须更改为 long。您也可以使用整数的负值范围,但如果您已经达到最大值,您可能很快就会用完空间。

但是,如果数据库中没有 20 亿个元素,则可以重用未使用的主键。这可能效率低下,因为您必须搜索未使用的密钥。

我建议只是通过更改代码的努力。从长远来看,现在付出努力会得到回报。

于 2013-03-14T16:11:18.480 回答
2

我无法将 int 更改为 long 以与 DB 对齐。因为这是巨大的努力。

从长远来看,您别无选择。开始编码。

实际上,如果您有条不紊地进行,您可能会发现这根本不是一项巨大的努力。Java IDE 非常适合帮助您进行此类更改。


@jjnguy 建议您让键环绕为负数。这将为您提供 20 亿左右的额外密钥,但是:

  • 您可能会比第一个 20 亿更快地使用第二个 20 亿,并且
  • 您的应用程序(或数据库)可能依赖于始终增加的键。

所以我会避免这种情况,除非即将发生翻车。

于 2013-03-14T16:09:58.900 回答
0

我假设您没有对 ID 使用负值。如果是这种情况,您可以让值溢出为负值。这将给您一些时间来重构您的代码以使用 along来存储您的数据。

于 2013-03-14T16:09:47.810 回答
0

你只需要用 uint、long 等替换 int 就没有别的办法了

于 2014-07-16T13:36:23.770 回答
0

这里大家建议改成long。在我看来,这也是最直接的方法。但是,你要求一个不同的。

您还可以创建另一个具有长值的列,从 PK 中复制该值,然后将其设置为 PK。虽然我认为这在技术上是更多的工作,但对于您的情况来说,它可能会更好,严格来说,这是对您对另一种方法的问题的回答。

(也许你有某种分片情况,有数千个分片,你不可能同时交换所有分片)。无论哪种方式都要非常小心!运行测试!

于 2015-02-05T20:31:36.573 回答
-1

BigInteger在 Java 中使用类。你可以变大,我的意思是非常大的值。请参考此链接:如何使用 BigInteger?

于 2017-11-21T15:06:07.713 回答