我从来没有见过这个。但是,它可能会在表部署后重新生成0。注意这个例子:
SET NOCOUNT ON;
GO
CREATE TABLE dbo.fooblat(id INT IDENTITY(1,1));
GO
INSERT dbo.fooblat DEFAULT VALUES;
GO 3
DELETE dbo.fooblat WHERE id = 2;
GO
DBCC CHECKIDENT('dbo.fooblat', RESEED, 0);
GO
INSERT dbo.fooblat DEFAULT VALUES;
GO 3
SELECT id FROM dbo.fooblat ORDER BY id;
GO
DROP TABLE dbo.fooblat;
结果:现在
id
----
1
1
2
3
3
,如果标识列也是主键或其他唯一的,这个相同的操作可能会在缺口依然充满,只重复违规将失败。所以用这个表定义再次重复:
CREATE TABLE dbo.fooblat(id INT IDENTITY(1,1) PRIMARY KEY);
GO
息率这个(第一成功插入填补了国内空白):
id
----
1
2
3
消息2627,级别14,状态1,行
违反PRIMARY KEY约束'PK_ fooblat _3213E83F6BF0A0C6'。无法在对象'dbo.fooblat'中插入重复键。重复的键值是(1)。
Msg 2627,Level 14,State 1,Line 1
违反PRIMARY KEY约束'PK_ fooblat _3213E83F6BF0A0C6'。无法在对象'dbo.fooblat'中插入重复键。重复的键值是(3)。
您可以通过确保表格在放入其他系统时正确接种来避免这种情况。这可能只是意味着使用更可靠的部署技术,也可能意味着 - 填充后,让任何用户在之前 - 你做这样的事情:
DECLARE @i INT, @sql NVARCHAR(MAX);
SELECT @i = MAX(id) FROM dbo.fooblat;
SET @sql = N'DBCC CHECKIDENT(''dbo.fooblat'', RESEED, ' + RTRIM(@i) + ');';
EXEC sp_executesql @sql;
非常感谢。这实际上是诀窍。 :) – Emsi 2013-02-13 03:51:11