Database 应对数据库标识/自动编号最大化的策略

Database 应对数据库标识/自动编号最大化的策略,database,database-design,types,identity,future-proof,Database,Database Design,Types,Identity,Future Proof,自动编号字段(例如SQL Server中的“identity”)是为数据库表提供唯一键的常用方法。然而,考虑到它们非常普遍,在将来的某个时候,我们将处理它们将开始达到最大值的问题 是否有人知道或有建议的策略来避免这种情况?我希望很多答案都会建议切换到guid,但是考虑到这需要大量的开发(特别是在许多系统集成并共享价值的情况下),还有其他方法吗?我们是否正朝着更新的硬件/操作系统/数据库只允许整数的值越来越大的方向前进?如果您真的希望您的ID用完,请使用bigint。出于最实际的目的,它永远不会用

自动编号字段(例如SQL Server中的“identity”)是为数据库表提供唯一键的常用方法。然而,考虑到它们非常普遍,在将来的某个时候,我们将处理它们将开始达到最大值的问题


是否有人知道或有建议的策略来避免这种情况?我希望很多答案都会建议切换到guid,但是考虑到这需要大量的开发(特别是在许多系统集成并共享价值的情况下),还有其他方法吗?我们是否正朝着更新的硬件/操作系统/数据库只允许整数的值越来越大的方向前进?

如果您真的希望您的ID用完,请使用
bigint
。出于最实际的目的,它永远不会用完,如果用完了,您可能应该使用
uniqueidentifier

如果每秒有30亿个(这意味着在3.0GHz处理器上有一个事务/周期)事务,那么
bigint
将需要大约一个世纪的时间才能用完(即使你推迟了一点符号)


也就是说,有一次,“.”:)

是否有可能循环浏览已从数据库中删除的数字?或者大部分记录还活着?只是一个想法


我的另一个想法是Mehrdad建议切换到bigint查看以下相关问题:


被接受/排名靠前的答案几乎涵盖了这一点。

标识列通常设置为从1开始,递增+1。负值与正值一样有效,从而使可用标识符的池加倍。

如果您可能获得的数据量如此之大,以至于您的ID达到最大值,那么您可能还需要支持复制,以便您可以拥有多个以某种方式同步的数据库实例

对于这种情况,以及您希望避免使用“可猜测”ID(web应用程序等)的情况,我建议使用默认为新Guid的Guid(Uniqueidentifiers)来替换标识列


因为guid是唯一的,所以即使记录同时添加到系统中,它们也允许正确同步数据。

是的,如果您使用bigint,这将使您多活3000万年:)我们的进程经常重新加载大型数据集(采样数据)并每次生成新的标识符。我们没有任何达到极限的危险,但我知道这是怎么可能的。事实上,这不是同一个问题。640K是一个计算限制,这在现实世界中是一个逻辑限制。显然,当时有超过640K的数据。@Paco:正如我在上面的评论中所说的,这不太可能,因为这个限制不是机器问题,而是逻辑问题。我在回答中提到了uniqueidentifier(GUID)。它们的缺点是不是一个简单的整数。当然,如果您使用的是复制或其他固有的。。。。。。需要guid,您应该使用它们。否则,如果问题只是溢出int,我不会使用uniqueidentifier,因为它可能会引入应用程序复杂性。