SQL Server IDENTITY 列自动重新播种

tus*_*eau 5 sql-server identity

我使用庞大的数据集。我的数据库中发生的许多事务都是巨大的——数万亿行,甚至更多。

一些表使用IDENTITY列,而不是用于唯一 ID,只是因为它简单快速,并提供并发解决方案来提供递增数字。但是,当该IDENTITY列达到其限制时,我希望它在达到其限制时立即在语句中自动重新设定种子。

我很欣赏这对大多数人来说是奇怪的行为,但至少将此功能作为一个选项是有意义的,当然吗?你甚至不能在事务中重新播种,我也不能使用 truncate(不想删除)。

为什么这是不可能的?有没有其他人遇到过这个问题?

功能如下:在 SQL Server 中,我有一个表作为序列号生成器,就像 Oracle 中的 Sequence 一样。我们希望数字的最大值是 999999,之后重置为 0。这个数字被添加到其他一些字段(其中一个是日期戳)以生成参考数字。

该系统是高度并发的,我需要它在生成参考号时相当明显。就目前而言,有一个每天运行的任务来重新播种该IDENTITY列,但由于每天的记录数量很大,如果处理的记录数大于 999999,我就会收到错误消息。

Mar*_*ian 3

您可以使用bigint数据类型以避免过于频繁地达到最大值。

bigint 的范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807),存储 = 8 字节。你是否经常超出这个限制?

如果您想重新设定种子,您应该能够dbcc checkident在事务中运行该语句,但您必须在代码中进行更多错误处理。

我不知道有什么IDENTITY属性可以自动重新设定其值,只能手动通过截断表或使用dbcc checkident. 您可以在表上创建一个触发器,一旦最后插入的值接近最大值,您就可以重新设定种子。但这可能会增加您的交易成本。