我遇到了一个奇怪的情况,我的数据库中的一些表的 ID 从 0 开始,即使 TABLE CREATE 具有 IDENTITY(1,1)。对于某些表是这样,但对于其他表则不然。它一直有效到今天。
我试过重置身份列:
DBCC CHECKIDENT (SyncSession, reseed, 0);
但是新记录从 0 开始。我尝试对所有表都这样做,但有些仍然从 0 开始,有些从 1 开始。
任何指针?
(我正在使用带有高级服务的 SQL Server Express 2005)
我遇到了一个奇怪的情况,我的数据库中的一些表的 ID 从 0 开始,即使 TABLE CREATE 具有 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'
这通常是更好的做法,因为它使表更接近其初始创建状态。
这是合乎逻辑的,因为您已将身份值更改(重新播种)为零?
DBCC CHECKIDENT (SyncSession, reseed, 1)
将重新设置您的身份列,并确保第一条新记录以 1 开头。
我有同样的问题,修改数据库后从备份中恢复。我只是添加一个虚拟记录,然后将其删除......然后将 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
当前接受的答案仅解释了这种烦人的现象。只有一个答案提供了某种解决方案,但并不真正实用,因为它需要一个虚拟插入,这使得它难以概括。
唯一通用的解决方案是重新设定标识值,然后检查当前标识值并在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
DBCC CHECKIDENT ( Table_Name, RESEED, 0 )
这是一种以 with 开头的方法id
,Zero(0)
然后从表中删除所有行,然后再次将数据放回表中。