从表中删除重复记录后, 我想更新表的Identity列,其中连续编号从1开始。这是我的表格详细信息
id(identity(1,1)),
EmployeeID(int),
Punch_Time(datetime),
Deviceid(int)
我需要通过存储过程执行此操作。 当我尝试在存储过程中使用语句时
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开始的连续编号更新该表的标识列。
答案 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)