2

我有一个带有主整数键值的表,它的自动递增一个一个,里面的值一直很好,直到 116,突然之后它从 10085 值继续......

我不知道为什么,但也许我做了一个收缩数据库。但无论如何我都知道 DBCC CHECKIDENT 命令。

我的问题是,如果我运行DBCC CHECKIDENT (mytable, RESEED, 116),它是否会损害我将来 ID 为 100085 的行?我的意思是当有一天我的行数达到 100084 时,sql server 会从其他 Id 跳转还是会抛出异常以插入重复的 Id?

4

2 回答 2

2

不建议使用以下命令

DBCC CHECKIDENT (mytable, RESEED, 116) 

因为当您的行数达到 100084 时它会抛出异常

有关更多信息,请阅读以下主题。它说建议从表中删除所有行。如果您想使用 DBCC CHECKIDENT 重新播种表

于 2016-10-29T10:42:07.707 回答
2

不要这样做

一旦标识列达到 100084,它将引发重复键异常。

它不会神奇地跳过以前生成的值以避免冲突。您可以从下面轻松看到这一点

CREATE TABLE mytable
  (
     x INT IDENTITY PRIMARY KEY,
     Y INT
  )

INSERT INTO mytable
            (Y)
SELECT TOP (200) number
FROM   master..spt_values

DELETE FROM mytable
WHERE  x BETWEEN 1 AND 150;

DBCC CHECKIDENT (mytable, RESEED, 1)

/*Works OK*/
INSERT INTO mytable
            (Y)
SELECT TOP (149) number
FROM   master..spt_values

/*Error*/
INSERT INTO mytable
            (Y)
SELECT TOP (10) number
FROM   master..spt_values 

消息 2627,级别 14,状态 1,第 25 行违反主键约束“PK__mytable__3BD019E5518439DD”。无法在对象“dbo.mytable”中插入重复键。重复键值为 (151)。该语句已终止。

于 2016-10-29T18:56:05.210 回答