如何自动将主键从1再次启动

时间:2012-05-15 12:58:45

标签: sql sql-server database sql-server-2008 stored-procedures

我使用的表格如下:

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开始排序?

3 个答案:

答案 0 :(得分:6)

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

想象一下,如果每次有人取消他们的电话服务,电话公司都会回去并重新分配所有取消号码以上的号码以消除差距。这会导致所有参与者的头痛。

PK不仅应该是唯一的,而且对于该行也应该是常量。更改行的标识会导致问题。

如果要在添加新记录时填写空白,可以使用IDENTITY INSERT,也可以从表中删除标识,并在每次插入记录时生成自己的ID。

而且,如果由于某种原因您尚未沟通,您仍然希望这样做 - 重新获得的答案是可行的方法。

答案 1 :(得分:4)

使用

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

EDIT2:

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

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

这将为您提供插入记录的机会,但我不建议您这样做:)

答案 2 :(得分:3)

您必须使用RESEED

DBCC CHECKIDENT (table_name, RESEED); 

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