Подтвердить что ты не робот

Как повторно засеять идентификатор таблицы в SQL Server 2008 и отменить все это безопасно?

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

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

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

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

Скажем, что я хочу, чтобы новые идентификаторы временно начинались с 12345, а в конце удаляли новые строки и устанавливали следующее удостоверение на то, что было бы.

4b9b3361

Ответ 1

Команда reset имеет свойство

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 ;

Ответ 2

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

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

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