Вопрос

Я удалил некоторые записи из таблицы в базе данных 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 или любое другое число, которое вы хотите.Я понял это, экспортировав базу данных и прочитав код сам.

Вы также можете написать это так, чтобы сделать его однострочным решением:

родовое слово
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top