Сброс автоинкремента в SQL Server после удаления
-
21-08-2019 - |
Вопрос
Я удалил некоторые записи из таблицы в базе данных SQL Server.Теперь идентификаторы увеличиваются со 101 до 1200.Я хочу снова удалить записи, но я хочу, чтобы идентификаторы вернулись к 102.Есть ли способ сделать это в SQL Server?
Решение
Выполните следующую команду, чтобы изменить значение mytable для начала с 1:
родовое словоПрочтите об этом в интерактивных книгах (BOL, справка по SQL).Также будьте осторожны, чтобы у вас не было записей выше, чем заданное вами начальное число.
Другие советы
если число= 0, то при следующей вставке поле автоинкремента будет содержать значение 1
если number= 101, то при следующей вставке поле автоинкремента будет содержать значение 102
Дополнительная информация ... Может быть вам полезна
Прежде чем указывать код автоматического приращения number
в приведенном выше запросе, вы должны убедиться, что столбец автоприращения существующей таблицы содержит значения меньше, чем код number
.
Чтобы получить максимальное значение столбца (column_name) из таблицы (table1), вы можете использовать следующий запрос
родовое словополу-идиотская защита:
родовое словоhttp://sqlserverplanet.com/tsql / using-dbcc-checkident-to-Reseed-a-table-after-delete
Попробуйте это:
родовое словоУдалить и повторно заполнить все таблицы в базе данных.
родовое словоЯ разобрался.Это:
родовое словоНа основе принятого ответа для тех, кто столкнулся с подобной проблемой, с полной квалификацией схемы:
([MyDataBase].[MySchemaName].[MyTable]
) ... приводит к ошибке, вы должны находиться в контексте этой БД
То есть следующее вызовет ошибку:
родовое словоВместо этого заключите полное имя таблицы в одинарные кавычки:
родовое словоВ нескольких ответах рекомендуется использовать оператор, подобный этому:
DBCC CHECKIDENT (mytable, RESEED, 0)
Но в OP сказано "удалены некоторые записи", которые могут быть не всеми из них, поэтому значение 0 не всегда является правильным.В другом ответе предлагалось автоматически найти максимальное текущее значение и повторно ввести его, но это приводит к проблемам, если в таблице нет записей, и, следовательно, max() вернет NULL.В комментарии предлагалось использовать просто
DBCC CHECKIDENT (mytable)
чтобы сбросить значение, но в другом комментарии правильно указано, что это только увеличивает значение до максимального, которое уже есть в таблице;это не уменьшит значение, если оно уже выше максимального значения в таблице, что и хотел сделать OP.
Лучшее решение сочетает в себе эти идеи.Первый CHECKIDENT сбрасывает значение в 0, а второй сбрасывает его до самого высокого значения в таблице на данный момент, на случай, если в таблице есть записи:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Как указывалось в многочисленных комментариях, убедитесь, что в других таблицах нет внешних ключей, указывающих на удаленные записи.В противном случае эти внешние ключи будут указывать на записи, которые вы создаете после повторного заполнения таблицы, что почти наверняка не то, что вы имели в виду.
Как правило, вы не хотите этого делать.Reseed может создать проблемы с целостностью данных.Это действительно только для использования в системах разработки, где вы стираете все тестовые данные и начинаете заново.Его не следует использовать в производственной системе, если все связанные записи не были удалены (не каждая таблица, которая должна быть во взаимосвязи внешнего ключа!).Вы можете создать беспорядок, делая это, особенно если вы собираетесь делать это регулярно после каждого удаления.Не стоит беспокоиться о пробелах в значениях идентификационных полей.
Я хочу добавить этот ответ, потому что подход DBCC CHECKIDENT
приведет к проблемам при использовании схем для таблиц.Используйте это, чтобы быть уверенным:
Если вы хотите проверить успешность операции, используйте
родовое словокоторый должен выводить код сгенерированного кода в приведенном выше примере.
Что насчет этого?
родовое словоЭто быстрый и простой способ изменить автоинкремент на 0 или любое другое число, которое вы хотите.Я понял это, экспортировав базу данных и прочитав код сам.
Вы также можете написать это так, чтобы сделать его однострочным решением:
родовое слово