4

我正在使用如下创建的表:

CREATE TABLE [dbo].[Tag](
    [TagID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](200) NOT NULL,
    [TagCount] [varchar](200) NULL,
 CONSTRAINT [PK_Tag] PRIMARY KEY CLUSTERED 
(
    [TagID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

我永远无法插入主键,它只是从最后一个自动继续。因此,如果我最后一个条目的主键是 72,那么下一个条目将是 73。

现在我的问题是当我删除一个条目时。现在说我删除了条目的 3-7,我的数据库将存储条目的 1、2、8、9 等。

是否有一个存储过程我可以在删除后运行以自动将我的主键从 1 重新排序?

4

3 回答 3

5

为什么你不想这样做的快速类比:

想象一下,如果每次有人取消他们的电话服务,电话公司就会返回并重新分配每个人的号码,高于取消的号码以消除差距。这将导致所有相关人员都感到头疼。

PK 不仅应该是唯一的,而且对于该行来说应该是恒定的。更改行的标识会导致问题。

如果您想在添加新记录时填补空白,您可以使用 IDENTITY INSERT,或者从表中删除身份并在每次插入记录时生成自己的 id。

而且,如果由于某种原因您还没有进行沟通,您仍然想这样做 - RESEED 的答案是您的最佳选择。

于 2012-05-15T13:14:14.300 回答
5

利用

TRUNCATE TABLE [dbo].[Tag]

这将清空所有数据并重置自动值计数器。

编辑:如果你想保存旧值。创建一个临时表,将所有数据存储在那里,截断您的主表并重新插入它们。但是你为什么要这样做呢?

像这样的事情(在交易中做):

CREATE TABLE [dbo].[TagTmp] (
 [Value] [varchar](200) NOT NULL,
    [TagCount] [varchar](200) NULL
)
INSERT INTO TagTmp (Value, TagCount)
SELECT Value, TagCount FROM dbo.Tag
TRUNCATE TABLE dbo.Tag
INSERT INTO Tag (Value, TagCount)
SELECT Value, TagCount FROM dbo.TagTmp
DROP TABLE TagTmp

编辑2:

如果要插入具有免费“旧”自动 ID 的记录,请使用:

SET IDENTITY_INSERT tablename OFF
INSERT INTO tablename (TagId, Value, tagCount) VALUES (3, 'value', 1');
SET IDENTITY_INSERT tablename ON

这将使您有机会插入记录,但我不建议这样做:)

于 2012-05-15T13:00:02.313 回答
3

你必须使用RESEED

DBCC CHECKIDENT (table_name, RESEED); 

删除后在触发器中使用它。

于 2012-05-15T13:12:19.853 回答