gun*_*erz 4 sql-server-2008 sql-server
我在 SQL Server 2008 上创建了一个新表。
该表有一个标识列,定义如下:
[ID] [int] IDENTITY(1,1) NOT NULL
Run Code Online (Sandbox Code Playgroud)
但是,当我插入任何数据时,第一条记录从 0 开始,而不是从 1 开始。
我希望记录从 1 开始。为什么这不起作用?
如果我删除该记录并将其重新设定为 0,则它可以工作。
Delete from [tablename]
DBCC CHECKIDENT('[tablename]', RESEED, 0)
Run Code Online (Sandbox Code Playgroud)
但是它不适用于新创建的表。
即使我删除并重新设置新创建的表,它仍然从 0 开始添加记录,而不是从 1 开始。
任何人都可以请建议我做错了什么。
谢谢
此行为已记录在案,但违反直觉:
当前标识值设置为 new_reseed_value。如果自创建表以来没有向表中插入行,或者如果使用 TRUNCATE TABLE 语句删除了所有行,则在运行 DBCC CHECKIDENT 后插入的第一行使用 new_reseed_value 作为标识。否则,插入的下一行使用 new_reseed_value + 当前增量值。
它被认为是一个错误(在现已解散的 Microsoft Connect 站点上),但不是一个将被修复的错误。变通方法包括避免RESEED
在新创建的表上使用该选项,或者使用更高的值,该值适用于所有情况但可能会导致间隙。IDENTITY
无论如何,差距几乎是不可避免的。如果您必须重新播种,请将其包裹在支票中,例如:
IF EXISTS
(
SELECT 1
FROM sys.identity_columns
WHERE
[object_id] = OBJECT_ID(N'dbo.T1', N'U')
AND last_value IS NOT NULL
)
BEGIN
DBCC CHECKIDENT('dbo.T1', 'RESEED', 0)
END;
Run Code Online (Sandbox Code Playgroud)
需要明确的是,创建一个表并添加一行将导致使用第一个标识值:
-- Tested on SQL Server 2008 SP3 CU8
-- build 10.0.5828
CREATE TABLE dbo.T1 (id int IDENTITY(1, 1));
INSERT dbo.T1 DEFAULT VALUES;
SELECT id FROM dbo.T1 AS t;
Run Code Online (Sandbox Code Playgroud)