重置现有值的标识列而不删除现有记录

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

【讨论】:

以上是关于重置现有值的标识列而不删除现有记录的主要内容,如果未能解决你的问题,请参考以下文章

删除记录时如何重置表的标识列?

如何在现有表中添加额外的列而不丢失数据

将标识列添加到雪花中的现有表?

如何将标识属性添加到 SQL Server 中的现有列

将 Oracle 序列重置为现有列中的下一个值的最佳方法?

如何在 SQL Server 中添加标识列?