Сброс автоинкремента в SQL Server после удаления - PullRequest
231 голосов
/ 04 февраля 2009

Я удалил некоторые записи из таблицы в базе данных SQL Server. Теперь идентификаторы идут от 101 до 1200. Я хочу снова удалить записи, но хочу, чтобы идентификаторы вернулись к 102. Есть ли способ сделать это в SQL Server?

Ответы [ 11 ]

407 голосов
/ 04 февраля 2009

Выполните следующую команду для повторного заполнения mytable, чтобы начать с 1:

DBCC CHECKIDENT (mytable, RESEED, 0)

Прочтите об этом в Книгах онлайн (BOL, справка по SQL). Также будьте осторожны, чтобы у вас не было записей выше, чем начальное значение.

79 голосов
/ 20 июня 2012
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

если число = 0, то при следующей вставке поле автоинкремента будет содержать значение 1

если число = 101, то при следующей вставке поле автоинкремента будет содержать значение 102


Дополнительная информация ... Может быть полезно вам

Перед автоматическим приращением number в приведенном выше запросе необходимо убедиться, что столбец автоматического приращения в существующей таблице содержит значения, меньшие number.

Чтобы получить максимальное значение столбца (column_name) из таблицы (table1), вы можете использовать следующий запрос

 SELECT MAX(column_name) FROM table1
34 голосов
/ 01 мая 2012

полу-идиотостойкий:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete

9 голосов
/ 28 июня 2013

Попробуйте это:

ALTER TABLE tablename AUTO_INCREMENT = 1
6 голосов
/ 17 марта 2014

Удалить и заново заполнить все таблицы в базе данных.

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.
6 голосов
/ 04 февраля 2009

Я понял это. Это:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
4 голосов
/ 07 апреля 2016

На основании принятого ответа для тех, кто столкнулся с подобной проблемой, с полной квалификацией схемы:

([MyDataBase].[MySchemaName].[MyTable]) ... приводит к ошибке, вы должны быть в контексте этой БД

То есть ошибка выдаст следующее:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

Вместо этого заключите полное имя таблицы в одинарные кавычки:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
3 голосов
/ 02 апреля 2017

В нескольких ответах рекомендуется использовать утверждение примерно так:

DBCC CHECKIDENT (mytable, RESEED, 0)

Но ОП сказал "удалил некоторые записи", что может быть не все из них, поэтому значение 0 не всегда является правильным. В другом ответе предлагалось автоматически найти максимальное текущее значение и пересчитать его, но это приведет к проблемам, если в таблице нет записей и, следовательно, max () вернет NULL. Комментарий предложил использовать просто

DBCC CHECKIDENT (mytable)

для сброса значения, но другой комментарий правильно заявил, что это только увеличивает значение до максимума, уже имеющегося в таблице; это не приведет к уменьшению значения, если оно уже выше максимального значения в таблице, что и хотел сделать ОП.

Лучшее решение объединяет эти идеи. Первый CHECKIDENT сбрасывает значение до 0, а второй сбрасывает его до самого высокого значения в настоящее время в таблице, если в таблице есть записи:

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

Как указано в нескольких комментариях, убедитесь, что в других таблицах нет внешних ключей, указывающих на удаленные записи. В противном случае эти внешние ключи будут указывать на записи, которые вы создаете после повторного заполнения таблицы, что почти наверняка не соответствует вашим ожиданиям.

2 голосов
/ 21 октября 2017

Я хочу добавить этот ответ, потому что DBCC CHECKIDENT -подход приведет к проблемам с продуктом при использовании схем для таблиц. Используйте это, чтобы быть уверенным:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

Если вы хотите проверить успешность операции, используйте

SELECT IDENT_CURRENT(@Table);

, который должен вывести 0 в примере выше.

2 голосов
/ 05 февраля 2009

Вы не хотите делать это вообще. Reseed может создать проблемы с целостностью данных. Это действительно только для использования в системах разработки, где вы стираете все тестовые данные и начинаете заново. Его не следует использовать в производственной системе, если все связанные записи не были удалены (не каждая таблица, которая должна быть связана с внешним ключом!). Делая это, вы можете создать беспорядок, особенно если вы хотите делать это регулярно после каждого удаления. Не стоит беспокоиться о пробелах в значениях полей идентичности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...