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