Joh*_*tie 13 sql-server overflow primary-key
我们有一个带有auto-increment int
主键的表,其最大值现在处于T-SQL int
类型的限制.当我们尝试重新播种表时(因为键中存在大的间隙,没有足够的行作为最大值int
),它会以某种方式不断重置为最大值int
.
显然,这会导致严重的问题.PK永远不应该达到这个值,改变数据类型将是一项艰巨的任务.重播应该足够了,但它不起作用!
它怎么能继续重置?
编辑:为了澄清情况,此查询SELECT MIN(CategoryID), MAX(CategoryID) FROM dbo.tblCategories
返回-2147483647,2147483647 ...意味着在int
类型的最小值和最大值处存在实际PK值.
您可以"重新设定"一个表,以便下一个分配的标识列将小于表中的当前最大值.但是,任何子队列DBCC CHECKIDENT
都会将内部计数器重置为当前列中的最大值.也许这就是重置的来源?当然,插入最终会达到重复值,从而为生产支持人员带来了有趣的时间.
总的来说,你遇到了麻烦.我建议使用一次性脚本来删除/重置超高ID值.更新行(和所有相关的外键值)是一个选项,虽然它将涉及必须禁用外键约束,我不知道其他所有,所以我不推荐它.另一种方法是使用更实用的Id值为"high-id"项创建所有数据的精确副本,然后删除原始条目.这是一个黑客攻击,但它会产生一个更易于维护的数据库.
哦,并追踪那些将这些高id值放入的人,并且 - 至少 - 撤销他们对数据库的访问权限.
我参与了一个有类似问题的项目——尽管在我们的案例中,有人选择了一个以 4 位数字作为主键的字段,当我们接近 9999 条记录时,这有点不起作用......
在我们的例子中,我们在表上创建了一个新列并填充它,将主键更改为该列,并将所有外键关系重新指向新键。
非常凌乱,但确实有效。
归档时间: |
|
查看次数: |
2841 次 |
最近记录: |