如何在SQL Server 2008中重新生成表标识(identity),并安全撤销所有更改?

77

我只是需要用于测试,测试完成后需要撤销。

我看过一些在线教程,介绍如何重新填充表格,但没有太多关于如何撤销的内容。

假设表格定义如下:

create table beer
(
 beer_id  numeric(10) not null,
 mnemonic        nvarchar(8)
);
go

假设我想让新的标识暂时从12345开始,并在最后删除新行并将下一个标识设置为原来应该的值。

2个回答

184

重置身份属性的命令是:

DBCC CHECKIDENT (tablename, RESEED, new_reseed_value)

当您想将列的标识设置为12345时,请运行此命令

DBCC CHECKIDENT (beer, RESEED, 12345)

当您想要删除测试行并将值恢复为先前的值时,可以执行以下操作。

DELETE
FROM beer
WHERE beer_id >= 12345 ;

DECLARE @NewSeed NUMERIC(10)
SELECT @NewSeed = MAX(beer_id)
FROM beer ;

DBCC CHECKIDENT (beer, RESEED, @NewSeed)

下面是您情景的演示。请注意,beer_id列是使用IDENTITY (1, 1)属性创建的,它将标识种子设置为1,并以1递增。

CREATE TABLE beer
    (        
    beer_id NUMERIC(10) IDENTITY (1,1) NOT NULL,
    mnemonic NVARCHAR(8)
    );

GO

INSERT INTO beer(mnemonic) VALUES ('Beer 1')
INSERT INTO beer(mnemonic) VALUES ('Beer 2')

SELECT *
FROM beer ;

DBCC CHECKIDENT (beer, RESEED, 12345)
GO

INSERT INTO beer(mnemonic) VALUES ('Beer 3')
INSERT INTO beer(mnemonic) VALUES ('Beer 4')

SELECT *
FROM beer ;

DELETE
FROM beer
WHERE beer_id >= 12345 ;

DECLARE @NewSeed NUMERIC(10)
SELECT @NewSeed = MAX(beer_id)
FROM beer ;

DBCC CHECKIDENT (beer, RESEED, @NewSeed)
GO

INSERT INTO beer(mnemonic) VALUES ('Beer 5')
INSERT INTO beer(mnemonic) VALUES ('Beer 6')

SELECT *
FROM beer ;

+1 谢谢,看起来是一个完整的答案。我会尝试一下。 - Hamish Grubijan
21
只是提醒一下,如果您需要知道当前种子是什么,可以运行此命令 SELECT IDENT_CURRENT('table_name') - iheartcsharp

5
有时我们会从某些用户那里获得模式限制,从而导致错误(找不到名称为“TableName”的表或对象。请检查系统目录),因此最好遵循以下代码。

Schema.TableName 应该用单引号括起来。

DECLARE @SeedValue INT
SET @SeedValue = (SELECT MAX(ColumnName) FROM Schema.TableName)
DBCC CHECKIDENT ('Schema.TableName',RESEED,@SeedValue)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接