我使用的表格如下:
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开始排序?
答案 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);
删除后在触发器中使用它。