SQL Server标识列值从0开始,而不是1

时间:2009-04-07 08:38:22

标签: sql sql-server-2005 tsql identity auto-increment

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

我已尝试重置标识栏:

DBCC CHECKIDENT (SyncSession, reseed, 0);

但是新记录从0开始。 我已尝试为所有表执行此操作,但有些仍然从0开始,有些从1开始。

任何指针?

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

6 个答案:

答案 0 :(得分:44)

来自DBCC CHECKIDENT

DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )
  

如果没有插入任何行   表自创建以来,或全部   已删除行使用   TRUNCATE TABLE语句,第一个   运行DBCC后插入的行   CHECKIDENT使用new_reseed_value作为   身份。否则,下一行   inserted使用new_reseed_value +   当前增量值。

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

答案 1 :(得分:4)

如果传递重新设定的值,数据库将从该新值开始标识:

DBCC CHECKIDENT (SyncSession, RESEED, 0); --next record should be 0 + increment

如果不使用IDENTITY(a,b),则不必传递a值:

DBCC CHECKIDENT (SyncSession, RESEED); --next record should be the seed value 'a'

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

答案 2 :(得分:2)

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

DBCC CHECKIDENT (SyncSession, reseed, 1)

将重新设置您的标识列,并确保第一个新记录以1开头。

答案 3 :(得分:2)

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

答案 4 :(得分: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 

答案 5 :(得分:-1)

DBCC CHECKIDENT ( Table_Name, RESEED, 0 )

这是一种使用id启动Zero(0)的方法,然后从表中删除所有行并再次将数据放回到表中。