Я вставил записи в таблицу базы данных SQL Server. Для таблицы был определен первичный ключ, и для начального идентификатора с автоприращением установлено значение «Да». Это делается главным образом потому, что в SQL Azure для каждой таблицы должны быть определены первичный ключ и идентификатор.
Но поскольку мне нужно удалить некоторые записи из таблицы, начальное число идентификаторов для этих таблиц будет нарушено, а столбец индекса (который создается автоматически с шагом 1) будет нарушен.
Как я могу сбросить столбец идентификаторов после удаления записей, чтобы столбец имел последовательность в порядке возрастания номеров?
Столбец идентификации не используется в качестве внешнего ключа в базе данных.
Ответы:
Команда
DBCC CHECKIDENT
управления используется для сброса счетчика идентификаторов. Синтаксис команды:Пример:
Это не поддерживалось в предыдущих версиях базы данных SQL Azure, но теперь поддерживается.
Обратите внимание, что
new_reseed_value
аргумент варьируется в зависимости от версии SQL Server в соответствии с документацией :Однако я нахожу эту информацию вводящей в заблуждение (на самом деле просто неверной), поскольку наблюдаемое поведение указывает, что по крайней мере SQL Server 2012 все еще использует new_reseed_value + логику текущего значения приращения. Microsoft даже противоречит собственному,
Example C
найденному на той же странице:Тем не менее, все это оставляет возможность для другого поведения в новых версиях SQL Server. Я предполагаю, что единственный способ быть уверенным, пока Microsoft не прояснит ситуацию в своей собственной документации, это сделать реальные тесты перед использованием.
источник
DBCC CHECKIDENT
поддерживается в следующем выпуске (V12 / Sterling): azure.microsoft.com/en-us/documentation/articles/… Хотя, для этой конкретной ситуации, я все равно рекомендую TRUNCATE TABLE :)Где 0 -
identity
начальное значениеисточник
TRUNCATE
, то новое начальное значение должно быть значением для следующего использования (т. Е. 1, а не 0). Если таблица не пуста, она будет использоватьnew_reseed_value + 1
. MSDNDELETE
, нетTRUNCATE
, в этом случае это тоже такnew_reseed+value + 1
. Я написал сообщение об этом, показывающее реальное поведение с помощью некоторых тестов, и обновил фактический документ (теперь, когда мы можем это сделать из-за того, что он находится на GitHub): Как действительно работает DBCC CHECKIDENT при сбросе семени идентификации (RESEED)? ,Следует отметить, что ЕСЛИ все данные удаляются из таблицы через
DELETE
(то есть безWHERE
предложения), то, если это разрешено разрешениями a), и b) отсутствуют FK, ссылающиеся на таблицу (которая, по-видимому, является случай здесь), использованиеTRUNCATE TABLE
было бы предпочтительным, так как это делает более эффективнымDELETE
и сбрасываетIDENTITY
семя в то же время. Следующие подробности взяты со страницы MSDN для TRUNCATE TABLE :Итак, следующее:
Становится просто:
Пожалуйста, смотрите
TRUNCATE TABLE
документацию (ссылка выше) для получения дополнительной информации об ограничениях и т. Д.источник
Хотя большинство ответов предлагают RESEED до 0, но во многих случаях нам нужно просто повторно заполнить до следующего доступного Id
Это проверит таблицу и вернется к следующему идентификатору.
источник
declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Я попытался
@anil shahs
ответить, и это сбросило личность. Но когда был вставлен новый ряд, он получилidentity = 2
. Поэтому вместо этого я изменил синтаксис:Тогда первый ряд получит тождество = 1.
источник
Несмотря на то, что большинство ответов предполагают ,
RESEED
чтобы0
, и в то время как некоторые видят это как недостаток дляTRUNCATED
таблиц, Microsoft имеет решение, исключающиеID
Это проверит таблицу и вернется к следующему
ID
. Это было доступно с MS SQL 2005 до настоящего времени.https://msdn.microsoft.com/en-us/library/ms176057.aspx
источник
Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.
но при новых вставках оно все еще использует неправильное начальное число.выдача 2 команды может сделать свое дело
первый сбрасывает тождество на ноль, а следующий устанавливает его на следующее доступное значение - jacob
источник
@jacob
Сработало для меня, мне просто нужно было сначала очистить все записи из таблицы, а затем добавить выше в триггерной точке после удаления. Теперь всякий раз, когда я удаляю запись, берется оттуда.
источник
Truncate
Таблица предпочтительна, потому что она очищает записи, сбрасывает счетчик и освобождает место на диске.Delete
иCheckIdent
должен использоваться только там, где внешние ключи не позволяют вам усекать.источник
Сброс идентификатора столбца с новым идентификатором ...
источник
Это общий вопрос, и ответ всегда один и тот же: не делайте этого. Значения идентичности должны рассматриваться как произвольные, и, как таковой, нет «правильного» порядка.
источник
Запустите этот скрипт, чтобы сбросить столбец идентификаторов. Вам нужно будет сделать два изменения. Замените tableXYZ на любую таблицу, которую нужно обновить. Кроме того, имя столбца идентификаторов необходимо удалить из временной таблицы. Это было мгновенно для таблицы с 35 000 строк и 3 столбцами. Очевидно, сделайте резервную копию таблицы и сначала попробуйте это в тестовой среде.
источник
Это установит текущее значение идентичности в 0.
При вставке следующего значения значение идентификатора увеличивается до 1.
источник
Используйте эту хранимую процедуру:
Просто вернусь к моему ответу. Я столкнулся со странным поведением в SQL Server 2008 R2, о котором вы должны знать.
Первый выбор производит
0, Item 1
.Второй производит
1, Item 1
. Если вы выполните сброс сразу после того, как таблица создана, следующее значение равно 0. Честно говоря, я не удивлен, что Microsoft не может сделать это правильно. Я обнаружил это, потому что у меня есть файл сценария, который заполняет справочные таблицы, которые я иногда запускаю после повторного создания таблиц, а иногда, когда таблицы уже созданы.источник
Я использую следующий скрипт для этого. Есть только один сценарий, в котором он выдаст «ошибку», если вы удалили все строки из таблицы, и
IDENT_CURRENT
в настоящее время установлено значение 1, то есть в таблице была только одна строка для начала.источник
Для полного удаления строк и сброса счетчика IDENTITY я использую это (SQL Server 2008 R2)
источник
Повторное заполнение до 0 не очень практично, если вы не чистите стол в целом.
В противном случае ответ Энтони Рэймонда идеален. Сначала получите максимальный столбец идентификаторов, затем начните с макс.
источник
Я пытался сделать это для большого количества таблиц во время разработки, и это работает как очарование.
Итак, сначала вы устанавливаете значение 1, а затем устанавливаете на самый высокий индекс из строк, представленных в таблице. Быстрый и легкий отдых от idex.
источник
Всегда лучше использовать TRUNCATE, когда это возможно, вместо удаления всех записей, поскольку он также не использует пространство журнала.
В случае, если нам нужно удалить и нам нужно сбросить начальное число, всегда помните, что если таблица никогда не заполнялась и вы использовали ее,
DBCC CHECKIDENT('tablenem',RESEED,0)
то первая запись получит identity = 0, как указано в документации по msdn.источник
TRUNCATE
это помешает вамROLLBACK
вести себя, как ожидалось? ROLLBACK по-прежнему откатывается. Даже если БД установлена вBULK_LOGGED
.Во-первых: просто укажите спецификацию: «Нет» >> Сохранить базу данных Выполнить проект
После этого: Идентификация идентификации просто: "ДА" >> Сохранить базу данных Выполнить проект
Ваш идентификатор базы данных, ПК Начните с 1 >>
источник