将SQL Server标识主键从1更改为顺序

时间:2013-07-09 17:15:39

标签: sql sql-server insert sql-server-2000 primary-key

我有一个SQL Server 2000表,其中包含我们所有员工编号,姓名和每位员工的信息。

公司出售后,所有数据将保持不变,除非所有员工身份号码都将被删除,并将根据每个人的原始雇用日期(doh)从1(并增加1)重新创建。 / p>

我可以按照所需顺序列出记录:

SELECT IdNumber    
FROM EmpTable    
ORDER BY doh ASC

IdNumber是一个标识主键,因此我必须暂时将其关闭...然后再将其重新打开。)没有其他内容与该键列相关联。这是一张包含所有内容的SINGLE表....这与每位员工有关。如果2名员工拥有相同的DOH,那么获得较低ID号并不重要。但我想我总是可以在二级字段上进行子排序,例如:姓氏

但是,如何将这些相同的记录写回同一个表格,只更改IdNumber列?

作为“第二选择”......我可以使用新的ID编号创建一个单独的表...然后在所有内容完成之后......并且正在工作......将新表放在网上。

作为“第三选择”......我可以使用1表...并添加一个新字段NewId,将新创建的ID放在那里。

我想有很多方法可以做到这一点......但我似乎无法弄清楚它们中的任何一个。

3 个答案:

答案 0 :(得分:0)

试试这个sql命令 DBCC CHECKIDENT(yourtable,reseed,1)

答案 1 :(得分:0)

假设您在IdNumber列上关闭了主键和标识,

UPDATE EmpTable
SET EmpTable.IdNumber = orderTable.rowNo
FROM( SELECT ROW_NUMBER() OVER (ORDER BY doh ASC) as rowNo, IdNumber
FROM EmpTable) as orderTable
WHERE orderTable.IdNumber = EmpTable.IdNumber

答案 2 :(得分:0)

要正确执行此操作而不会丢失相关表的数据完整性,最好的办法是 脚本输出(以便以后更容易重置)并使用旧ID删除所有FK。

为新员工ID添加新列。重命名旧列,旧Id并为新列添加旧名称。然后使用oldid列将所有相关表中的员工ID更新为新ID。然后重新添加FK。这应该在单用户模式下使用数据库完成,并且在完成时不应该对数据库进行任何其他更改。您可能希望删除并重新创建所有索引(这些索引也应该编写脚本)。

顺便提一下,如果两个或多个员工拥有相同的雇用日期,您将需要一个计划来处理它。这也需要首先在开发环境中完成,然后需要对所有应用程序,报告,导入/导出进行全面测试,以确保它们仍然有效。通常情况下,如果不是更长时间(取决于数据库的复杂性),至少需要一个月的时间来进行设置和测试,然后再转移到prod。这是一项无法以偶然或slapdash方式完成的crtitcal任务。甚至不要考虑这样做,除非你有很好的备份,你知道如何恢复(并且已经预算了这样做)。