我使用的表如下:
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命令为?
发布于 2012-05-15 13:00:02
使用
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 TagTmpEDIT2:
如果要插入具有免费“旧”自动id的记录,请使用:
SET IDENTITY_INSERT tablename OFF
INSERT INTO tablename (TagId, Value, tagCount) VALUES (3, 'value', 1');
SET IDENTITY_INSERT tablename ON这将给您插入记录的机会,但我不建议您这样做:)
发布于 2012-05-15 13:14:14
简单地类比一下你为什么不想这样做:
想象一下,如果每次有人取消他们的电话服务,电话公司回去重新分配每个人的号码高于被取消的号码,以消除差距。这将导致所有参与者的头痛得到缓解。
PK不仅应该是唯一的,而且对于该行也应该是常量。更改行的标识会导致问题。
如果要在添加新记录时填补空白,则可以使用标识插入,也可以在每次插入记录时从表中删除标识并生成自己的id。
而且,如果由于某种原因,你还没有沟通,你还想这么做--重新确定的答案是可行的。
发布于 2012-05-15 13:12:19
你必须使用RESEED
DBCC CHECKIDENT (table_name, RESEED); 删除后在触发器中使用此选项。
https://stackoverflow.com/questions/10601179
复制相似问题