重置现有值的标识列而不删除现有记录
Posted
技术标签:
【中文标题】重置现有值的标识列而不删除现有记录【英文标题】:Reset identity column for existing values without deleting existing records 【发布时间】:2016-04-27 05:28:53 【问题描述】:我的表有 100000 条记录。在此,我有一列是身份列。现在我只想更新身份列的所有这些记录。我想更新所有现有的身份种子并从 3000 开始。
我找到了这个查询,但它只适用于新记录:
DBCC CHECKIDENT ('[Patient]', RESEED, 3000);
【问题讨论】:
您为什么要这样做?标识列值绝不意味着业务值。 您可以查看以下链接。可能对你有帮助。 ***.com/questions/19155775/… 我在生产服务器上遇到了这个问题,现在想解决这个问题。你有什么解决办法吗? @Nagahornbill 我有外键引用所以我不能删除记录 我同意 Raj 的观点 - 我总是建议,如果您关心标识列的 numeric 值,那么您就用错了。当您想要一个唯一的、不透明的 blob 数据来唯一标识行并且它们恰好适合具有数字类型的列时,应该使用它们。 【参考方案1】:我自己找到了解决方案
步骤 1) 转到 SQL 工具菜单 步骤 2) 选择选项菜单 步骤 3) 将打开新的弹出窗口,点击 Designers 步骤 4) 取消选中复选框 - 防止保存需要重新创建表的更改 步骤 5) 右键单击您的表格 步骤 6) 在设计模式下打开 步骤 7) 删除身份列 步骤 8) 再次使用以下查询添加带有标识的已删除列
alter table tableName
add columnName BIGINT identity(5000,1)
它会起作用的
【讨论】:
【参考方案2】:带有 reseed 的 Dbcc checkident 将更改实际的身份计数器,而不是表中的值。要更改值,您必须使用“set identity_insert”
【讨论】:
【参考方案3】:这是另一种可能的解决方案。创建一个与您的 Patient 表具有相同定义的新表(我们称之为 PatientNew)。将该表重新设置为所需值 3000 - 1 的开头。现在将 Patient 表复制到新表中,然后它将根据您的要求具有标识。删除旧表并重命名新表。像这样的:
delete from PatientNew
dbcc checkident('PatientNew', reseed, 2999)
insert PatientNew(Col2, Col3) select Col2, Col3 from Patient
在插入中省略标识列,名称包括所有其他列。表删除和重命名操作可能需要您临时删除外键约束
ALTER TABLE Patient NOCHECK CONSTRAINT ALL
重命名后再次启用:
ALTER TABLE Patient WITH CHECK CHECK CONSTRAINT ALL
【讨论】:
以上是关于重置现有值的标识列而不删除现有记录的主要内容,如果未能解决你的问题,请参考以下文章