Как заново заполнить идентификатор таблицы в SQL Server 2008 и безопасно отменить все это? - PullRequest
49 голосов
/ 20 августа 2010

Мне нужно сделать это только для тестирования, но затем отменить его после завершения теста.

Я видел несколько онлайн-уроков о том, как заново заполнить таблицу, но не столько о том, как ее отменить.

Допустим, определение таблицы следующее:

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

Допустим, я хочу, чтобы новые идентификаторы временно начинались с 12345, а в конце удалили новые строки и задали следующий идентификатор, как это было бы.

Ответы [ 2 ]

122 голосов
/ 20 августа 2010

Команда для сброса свойства удостоверения:

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 ;
0 голосов
/ 22 мая 2019

Иногда у нас есть ограничение Схемы от некоторых пользователей, что приводит к ошибке ( Не удается найти таблицу или объект с именем «TableName». Проверьте системный каталог ), поэтому лучше всего следовать приведенным ниже инструкциям.код.

Schema.TableName должно быть заключено в апостроф

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