通过SQL存储过程更新具有连续数字的表的标识列

时间:2015-04-23 09:52:53

标签: sql sql-server sql-server-2008 stored-procedures

从表中删除重复记录后, 我想更新表的Identity列,其中连续编号从1开始。这是我的表格详细信息

id(identity(1,1)),
EmployeeID(int),
Punch_Time(datetime),
Deviceid(int)

enter image description here

我需要通过存储过程执行此操作。 当我尝试在存储过程中使用语句时

DECLARE @myVar int
        SET @myVar = 0
        set identity_insert TempTrans_Raw# ON
        UPDATE  TempTrans_Raw# SET  @myvar = Id = @myVar + 1
        set identity_insert TempTrans_Raw# off

给出了错误...无法更新标识列'Id' 任何人都建议如何使用从1开始的连续编号更新该表的标识列。

4 个答案:

答案 0 :(得分:4)

--before running this make sure Foreign key constraints have been removed that reference the ID. 

--insert everything into a temp table
SELECT (ColumnList) --except identity column
INTO #tmpYourTable
FROM yourTable

--clear your table
DELETE FROM yourTable
-- reseed identity
DBCC CHECKIDENT('table', RESEED, new reseed value)
--insert back all the values 
INSERT INTO yourTable (ColumnList)
SELECT OtherCols FROM #tmpYourTable
--drop the temp table
DROP TABLE #tmpYourTable
GO

答案 1 :(得分:1)

如果您确实需要序列号,我建议您创建一个包含有效数字的表(“OrderNumbers”),然后在向您的表添加行时让程序从OrderNumbers中选择一行。

如果您在一个交易中的所有内容(即使用Begin Tran和Commit),那么您可以为一行获得一个没有gabs的数字。

此列上的两个表都应具有主键或唯一键,以防止重复。

HIH, 亨利克

答案 2 :(得分:1)

IDENTITY keword用于生成一个密钥,该密钥可与PRIMARY KEY约束结合使用以获取技术密钥。这些键是技术,它们用于链接表记录。它们应该没有其他含义(例如排序顺序)。 SQL Server不保证生成的ID是连续的。但他们确实保证你能按顺序完成它们。 (所以你可能得到1,2,4 ......,但从来没有1,4,2 ......)

以下是IDENTITY的文档:https://msdn.microsoft.com/de-de/library/ms186775.aspx

我个人不喜欢保证生成的ID有序。除了提供对记录的引用之外,技术ID应该没有其他意义。您可以依赖订单,但如果订单是您感兴趣的信息,您应该存储我认为的信息(例如,以时间戳的形式)。< / p>

如果您想要一个号码告诉您记录是第五或第十六或任何记录顺序,您可以使用ROW_NUMBER函数随时获取该号码。因此,不需要生成和存储这样的连续值(当涉及到表上的并发事务时,这也可能非常麻烦)。以下是如何获得该数字:

select
  row_number() over(order by id),
  employeeid,
  punch_time,
  deviceid
from mytable;

说完了这一切;永远不需要更改ID。如果您觉得有需要,这是不适当的桌面设计的标志。

答案 3 :(得分:-1)

检查此功能:DBCC CHECKIDENT('table', RESEED, new reseed value)