8

由于数据库不重用已删除记录的数量,因此可能会用完数字,特别是如果您为此列选择的不是真正的大整数类型。
如果情况不好,会发生什么以及如何预防?

// SQL 服务器,MySQL //

4

10 回答 10

10

你最终会有 3 小时以上的停机时间,就像Slashdot在他们的评论功能上所做的那样。

于 2008-10-31T14:14:03.653 回答
5

我认为究竟会发生什么将取决于您使用的数据库引擎(MySQL 中的 INNODB 和 MyISAM 之间甚至可能存在差异)。不管发生什么,它都不会很漂亮。

您只需将列类型更改为更大的整数。

于 2008-10-31T14:10:59.617 回答
2

对于 MySQL,据记载:

如果用户为列分配负值或者该值变得大于指定整数类型中可以存储的最大整数,则不会定义自动增量机制的行为。

于 2008-10-31T14:10:25.907 回答
2

大多数数据库系统都有一个比 32 位更宽的数字数据类型。如果您预计超过 2^32 条记录,则应使用适当的键宽。

于 2008-10-31T20:10:07.147 回答
1

是的,这是可能的:如果您只允许 2 位数字,则您的 ID 最多只能为 99,依此类推。一旦达到限制,插入就会失败。选择合适的尺寸是常识。

于 2008-10-31T14:12:51.830 回答
1

在 Postgres 中,"serial" 类型等价于使用 NO CYCLE 选项创建 SEQUENCE,并将字段的默认值设置为 nextval。用尽这样的序列会产生错误:

http://www.postgresql.org/docs/8.3/interactive/sql-createsequence.html

于 2008-10-31T14:18:36.733 回答
1

这取决于您的数据库,我相信 MS SqlServer,在解决问题之前您根本无法插入任何新行。上次我遇到它时,我们通过将标识列重新设置为 1 来解决问题。这显然不是一个通用的解决方法,但我们的情况没问题。

于 2008-10-31T20:10:17.613 回答
0

Oracle 不支持自动递增 ID 列,标准做法是使用序列生成器。一个序列生成最多 28 位的整数,所以如果你用完了这些整数,那么......我猜你有一个很大的表。但是行为将取决于序列生成器的配置——要么是错误,要么会循环回到起始值,并且您将在下一次插入时违反 PK 约束。

于 2008-10-31T20:31:34.513 回答
0

我前段时间在 SQL 2000 中尝试过这个。Integer.MaxValue 之后的下一个标识值是 Integer.MinValue。然后它会像您期望的那样继续计数。只要曾经存在于 1,2,3 等处的记录在到达那里时已经消失,就不会发生任何不好的事情。如果它遇到重复项(并且该字段是主键),则插入会因键冲突而失败。我还没有尝试过不受唯一值限制的标识列。我猜它会对重复项感到满意。

于 2008-10-31T20:49:18.457 回答
0

通常你会得到一个错误。如果您偏执,请使用 BIGINT。

于 2009-10-30T16:18:02.507 回答