通过 SQL 存储过程更新具有连续数字的 table 的标识列
Updating Identity Column of a table with consecutive numbers through SQL Stored Procedure
删除 table 中的重复记录后,
我想用从 1 开始的连续编号更新 table 的标识列。这是我的 table 详细信息
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 开始的连续编号更新 table 的标识列。
检查这个函数:DBCC CHECKIDENT('table', RESEED, new reseed value)
--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
如果你真的需要序列号,我可以建议你创建一个带有有效数字的table("OrderNumbers"),然后让你在添加一行时从OrderNumbers中选择一行到你的桌子。
如果您在一次交易中完成所有操作(即使用 Begin Tran 和 Commit),那么您可以获得一行一个数字,没有任何废话。
您应该在此列的两个 table 上都有主键或唯一键,以防止重复。
嗨,
亨里克
IDENTITY 关键字用于生成密钥,该密钥可与 PRIMARY KEY 约束结合使用以获得技术密钥。此类键是技术,它们用于link table 记录。它们应该没有其他含义(例如排序顺序)。 SQL服务器不保证生成的ID是连续的。但是,他们确实保证您将它们整理好。 (所以你可能会得到 1、2、4,...,但永远不会得到 1、4、2,...)
这是 IDENTITY 的文档:https://msdn.microsoft.com/de-de/library/ms186775.aspx。
就我个人而言,我不喜欢保证生成的 ID 是有序的。除了提供对记录的引用之外,技术 ID 应该没有任何意义。您可以依赖订单,但如果订单是您感兴趣的信息,您应该存储我认为的信息(以例如时间戳)。
如果您想要一个数字告诉您某条记录是第五条或第十六条或任何顺序的记录,您可以随时使用 ROW_NUMBER 函数即时获取该数字。所以不需要生成和存储这样的连续值(这在 table 上的并发事务时也会很麻烦)。以下是获取该数字的方法:
select
row_number() over(order by id),
employeeid,
punch_time,
deviceid
from mytable;
说了这么多;永远不需要更改 ID。如果您觉得有必要,这是 table 设计不当的标志。
删除 table 中的重复记录后, 我想用从 1 开始的连续编号更新 table 的标识列。这是我的 table 详细信息
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 开始的连续编号更新 table 的标识列。
检查这个函数:DBCC CHECKIDENT('table', RESEED, new reseed value)
--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
如果你真的需要序列号,我可以建议你创建一个带有有效数字的table("OrderNumbers"),然后让你在添加一行时从OrderNumbers中选择一行到你的桌子。
如果您在一次交易中完成所有操作(即使用 Begin Tran 和 Commit),那么您可以获得一行一个数字,没有任何废话。
您应该在此列的两个 table 上都有主键或唯一键,以防止重复。
嗨, 亨里克
IDENTITY 关键字用于生成密钥,该密钥可与 PRIMARY KEY 约束结合使用以获得技术密钥。此类键是技术,它们用于link table 记录。它们应该没有其他含义(例如排序顺序)。 SQL服务器不保证生成的ID是连续的。但是,他们确实保证您将它们整理好。 (所以你可能会得到 1、2、4,...,但永远不会得到 1、4、2,...)
这是 IDENTITY 的文档:https://msdn.microsoft.com/de-de/library/ms186775.aspx。
就我个人而言,我不喜欢保证生成的 ID 是有序的。除了提供对记录的引用之外,技术 ID 应该没有任何意义。您可以依赖订单,但如果订单是您感兴趣的信息,您应该存储我认为的信息(以例如时间戳)。
如果您想要一个数字告诉您某条记录是第五条或第十六条或任何顺序的记录,您可以随时使用 ROW_NUMBER 函数即时获取该数字。所以不需要生成和存储这样的连续值(这在 table 上的并发事务时也会很麻烦)。以下是获取该数字的方法:
select
row_number() over(order by id),
employeeid,
punch_time,
deviceid
from mytable;
说了这么多;永远不需要更改 ID。如果您觉得有必要,这是 table 设计不当的标志。