当表中的字段接近最大有符号或无符号 32 位整数时该怎么办?

Aer*_*oss 13 mysql

在任何以唯一自动增量字段形式保存用户记录的给定数据库中(例如,用户间消息)......当时间到来并且接近最大有符号或无符号数时该怎么办当前数据类型?(一个 32 位的 INT)?我猜测数据库服务器在尝试将 (2?32)-1 数字分配给下一个条目时会溢出,因此,如何避免这种情况发生(为了问题而无需更改数据类型)和继续添加记录?你会怎么办?

为什么我要使用 INT 而不是,例如,VARCHARS?

自从我问自己这个假设性问题以来已经好几天了,我想知道专业人士会做什么。

Mil*_*s D 12

您通常会使用整数而不是 varchars,因为它们占用更少的空间,已经很好地理解排序模式可以快速索引等。整数是 CPU 的自然数据类型,因此性能通常是最佳的。通常一个整数是 4 个字节,相当于(非 unicode)varchar 中的 4 个字符。

如果您担心 INT 类型的空间不足,请尝试 BIGINT,它为您提供 8 字节的数字。这方面的限制非常大,在达到记录限制之前,您可能已经用完了磁盘空间:-) BIGINT 的性能也会非常好,尤其是现在许多服务器也是 64 位的.

关于当你用完 INT 时会发生什么的问题的第一部分的答案并不简单,特别是正如你所说的,没有将数据类型更改为 BIGINT。基本上,您无能为力,而且您能做的事情在很大程度上受到数据库中数据性质的限制。哪些记录是该数据的外键?您是否仍然需要该表中的所有数据和相关记录?假设您可以归档大量初始数据(及其相关数据),那么我唯一能建议的就是将数据移出表(假设前 1 到 X 百万条记录),然后将身份种子重置为 1。虽然我不推荐它,但有各种各样的原因 - 例如,我看到有很多代码可以执行诸如检查 id 字段的最大值之类的事情,查看刚刚添加的内容,这是行不通的(也不应该这样做)。此外,人们假设记录 N 是在 N+1 之前创建的。我想没有简单的答案。

最后,我不知道 MySQL,但如果达到限制,SQL Server 会给出溢出错误。


gbn*_*gbn 9

一个被忽视的一点是,许多人从 1 开始自动编号或身份,因此立即失去了可能范围的一半(对于签名)

您只需重新定义数字以从 -1 开始,在这种情况下增加 -1。

可以说,如果您曾期望填充身份列,那么您应该在开始时设计它并使用更广泛的数据类型。

在 SO 上查看最近的这个问题:SQL Server 2008:如果身份超过 int 的最大值会发生什么?