我的数据库中有一些表的ID从0开始,尽管在创建表时使用了IDENTITY(1,1)。 这种情况发生在某些表中,而另一些表则没有。 直到今天为止都一直工作正常。
我尝试过重置自增列:
DBCC CHECKIDENT (SyncSession, reseed, 0);
但新记录从0开始。 我已经尝试对所有表格进行此操作,但有些从0开始,有些从1开始。
有什么指示吗?
(我正在使用带高级服务的SQL Server Express 2005)
我的数据库中有一些表的ID从0开始,尽管在创建表时使用了IDENTITY(1,1)。 这种情况发生在某些表中,而另一些表则没有。 直到今天为止都一直工作正常。
我尝试过重置自增列:
DBCC CHECKIDENT (SyncSession, reseed, 0);
但新记录从0开始。 我已经尝试对所有表格进行此操作,但有些从0开始,有些从1开始。
有什么指示吗?
(我正在使用带高级服务的SQL Server Express 2005)
DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )
如果自从创建表以来没有插入行,或者使用TRUNCATE TABLE语句删除了所有行,则在运行DBCC CHECKIDENT后插入的第一行将使用new_reseed_value作为标识。否则,插入的下一行将使用new_reseed_value +当前增量值。DBCC CHECKIDENT (SyncSession, RESEED, 0); --next record should be 0 + increment
如果您不想传递a值,也可以不用传递,这时将使用IDENTITY(a,b)
:
DBCC CHECKIDENT (SyncSession, RESEED); --next record should be the seed value 'a'
通常最好的做法是这样的,因为它使表格保持更接近其初始创建状态。
IDENTITY(1,1)
指定的列,在 INSERT
语句之前我总是调用 DBCC CHECKIDENT (AspNetRoles, RESEED, 0);
。然而,在第一次插入时(即数据库刚刚创建或使用 TRUNCATE TABLE 删除了所有行),Id 始终为 0。 - SamDBCC CHECKIDENT (AspNetRoles, RESEED, 0)
将把标识重置为0
,使用DBCC CHECKIDENT (AspNetRoles, RESEED)
将其重置为表定义所指定的值。 - KeithDBCC CHECKIDENT (SyncSession, reseed, 1)
目前被接受的答案只是解释了这个令人烦恼的现象。只有一个答案提供了某种解决方案,但并不实用,因为它需要插入虚拟数据,这使得泛化变得困难。
唯一通用的解决方案是重新设置标识值,然后检查当前标识值,并在其为0
时再次重新设置。这可以通过存储过程来完成:
CREATE OR ALTER PROCEDURE ReseedIdentity
@tableName SYSNAME
AS
BEGIN
DBCC CHECKIDENT(@tableName, RESEED, 0)
IF IDENT_CURRENT(@tableName) = 0
BEGIN
DBCC CHECKIDENT(@tableName, RESEED, 1)
END
END
无论是新表、截断还是删除所有记录,这都将始终以身份值1
开始新记录。
如果有以更高种子值开头的身份规范,则可以使用稍微高级一点的版本,这是前一个版本的概括:
CREATE OR ALTER PROCEDURE ReseedIdentity
@tableName SYSNAME
AS
BEGIN
DECLARE @seed NUMERIC(18,0) = IDENT_SEED(@tableName) - 1;
DBCC CHECKIDENT(@tableName, RESEED, @seed)
IF IDENT_CURRENT(@tableName) = @seed
BEGIN
SET @seed = @seed + 1
DBCC CHECKIDENT(@tableName, RESEED, @seed)
END
END
我有同样的问题,在修改数据库后进行备份还原。我只需添加一个虚拟记录,然后将其删除...然后将RESEED设置为0。看起来可以解决问题。
试试这个
DECLARE @c TABLE (TanvtechId varchar(10),NewTanvtechId Varchar(10))
INSERT INTO @c
SELECT TanvtechId , Row_Number() OVER (ORDER BY TanvtechId ) from Tanvtech
UPDATE G
SET G.TanvtechId =a.NewTanvtechId
FROM Tanvtech as G INNER JOIN @c as a ON a.TanvtechId =G.TanvtechId
DBCC CHECKIDENT ( Table_Name, RESEED, 0 )