当主键溢出时,您会怎么做?

时间:2011-04-28 15:22:27

标签: sql-server primary-key overflow

我们有一个带有auto-increment int主键的表,其最大值现在处于T-SQL int类型的限制。当我们尝试重新设置表的种子时(因为键中存在大的间隙,没有足够的行作为最大int值),它会以某种方式不断重置为最大int值。 / p>

显然,这会导致严重的问题。 PK永远不应该达到这个值,改变数据类型将是一项艰巨的任务。重播应该足够了,但它不起作用!

怎么能继续重置?

编辑:为了澄清这种情况,此查询SELECT MIN(CategoryID), MAX(CategoryID) FROM dbo.tblCategories返回-2147483647,2147483647 ...意味着在int类型的最小值和最大值处存在实际PK值。

3 个答案:

答案 0 :(得分:7)

您可以“重新设定”一个表,以便下一个分配的标识列将小于表中的当前最大值。但是,任何子序列DBCC CHECKIDENT都会将内部计数器重置为当前列中的最大值。也许这就是重置的来源?当然,插入最终会达到重复值,从而为生产支持人员带来了有趣的时间。

总的来说,你遇到了麻烦。我建议使用一次性脚本来删除/重置超高ID值。更新行(和所有相关的外键值)是一个选项,虽然它将涉及必须禁用外键约束,我不知道其他所有,所以我不推荐它。另一种方法是使用更实用的Id值为“高id”项创建所有数据的精确副本,然后删除原始条目。这是一个黑客攻击,但它会产生一个更易于维护的数据库。

哦,并追踪那些将这些高id值放入其中的人,并且 - 至少 - 撤销他们对数据库的访问权限。

答案 1 :(得分:4)

我参与了一个有类似问题的项目 - 虽然在我们的案例中,有人选择了一个4位数字作为主键的字段,当我们接近9999条记录时,这种情况不起作用......

在我们的例子中,我们在表上创建了一个新列并填充了该列,将主键更改为该列,并将所有外键关系重新设置为新键。

非常凌乱,但确实有效。

答案 2 :(得分:0)

创建一个具有相同结构的新表。从旧到新阅读(PK除外)。然后删除旧的并重命名新的。