48

我遇到了一个奇怪的情况,我的数据库中的一些表的 ID 从 0 开始,即使 TABLE CREATE 具有 IDENTITY(1,1)。对于某些表是这样,但对于其他表则不然。它一直有效到今天。

我试过重置身份列:

DBCC CHECKIDENT (SyncSession, reseed, 0);

但是新记录从 0 开始。我尝试对所有表都这样做,但有些仍然从 0 开始,有些从 1 开始。

任何指针?

(我正在使用带有高级服务的 SQL Server Express 2005)

4

7 回答 7

53

来自DBCC CHECKIDENT

DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )

如果自创建表以来没有向表中插入任何行,或者使用 TRUNCATE TABLE 语句删除了所有行,则在运行 DBCC CHECKIDENT 后插入的第一行使用 new_reseed_value 作为标识。否则,插入的下一行使用 new_reseed_value + 当前增量值。

因此,对于空表或截断表,这是预期的。

于 2009-04-07T08:49:22.750 回答
7

如果您传递一个重新种子值,则数据库将从该新值开始标识:

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'

这通常是更好的做法,因为它使表更接近其初始创建状态。

于 2014-03-05T14:07:58.693 回答
3

这是合乎逻辑的,因为您已将身份值更改(重新播种)为零?

DBCC CHECKIDENT (SyncSession, reseed, 1)

将重新设置您的身份列,并确保第一条新记录以 1 开头。

于 2009-04-07T08:43:46.867 回答
2

我有同样的问题,修改数据库后从备份中恢复。我只是添加一个虚拟记录,然后将其删除......然后将 RESEED 设置为 0。似乎工作。

于 2010-09-30T15:01:10.233 回答
1

试试这个

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 
于 2011-06-20T14:20:58.177 回答
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
于 2021-09-09T09:54:05.703 回答
-1
DBCC CHECKIDENT ( Table_Name, RESEED, 0 )

这是一种以 w​​ith 开头的方法idZero(0)然后从表中删除所有行,然后再次将数据放回表中。

于 2016-05-26T07:12:36.900 回答