Скинути значення IDENTITY


16

У мене є таблиця зі стовпцем Ідентичність. Під час розвитку я періодично видаляю рядки і додаю їх знову. Але значення IDENTITY завжди збільшувались і не починалися з 1, коли я знову додавав їх. Тепер мій ідентифікатор йде з 68 -> 92, і це руйнує мій код.

Як скинути значення IDENTITY?


Я б зробив свій код більш стійким до відсутніх значень ідентичності. Ідентифікаційний стовпчик не гарантує безперервної нумерації, і , врешті-решт, це станеться
Трубс

Відповіді:


29

Ви можете скинути значення ідентичності на

DBCC CHECKIDENT('tableName', RESEED, 0)

Тож наступного разу, коли ви вставлятимете в TableName, введене значення ідентичності буде 1.

Якщо ви видалите рядки з таблиці, воно не скине значення Identity, але продовжить збільшувати його. Так само, як і у вашому випадку.

Тепер, коли ви врізаєте таблицю, вона скине значення Identity до початкового значення Seed таблиці.

Зверніться до: SQL SERVER - DELETE, TRUNCATE та RESEED Identity для детального прикладу та хорошого пояснення різниці між скороченням та видаленням


22

Kin показав вам, як можна скинути значення IDENTITY, але поза середовищем розробки, коли ви дійсно видаляєте всі дані, навіщо це потрібно робити?

Я сподіваюся, що ви не збираєтесь підтримувати суміжну послідовність значень IDENTITY під час виробництва. І я сподіваюся, що ви насправді не пишете свій код для жорсткого кодування значень IDENTITY. Якщо це значущі значення ідентифікатора, то вам слід припинити використання властивості IDENTITY.

Є кілька речей, які заважають цьому не статися:

  • якщо значення IDENTITY присвоюється під час транзакції, а транзакція повертається назад, значення не "повертається назад", і наступним значенням буде те, яке ніколи не використовується + 1.
  • якщо рядок буде видалено пізніше, IDENTITY ніколи не повернеться, щоб заповнити прогалини.
  • в SQL Server 2012 є активна помилка, яка не буде виправлена, поки SQL Server 2014 ніколи не буде виправлено (якщо ви не використовуєте недокументований і дуже дорогий прапор сліду), завдяки чому перезапуск буде видаляти до 1000 значень із стовпця ІДЕНТИМЕТНОСТІ . Помилка підключення дозволяє припустити, що це обмежено випадками аварійних ситуацій, що включають групи доступності, але я можу запевнити, що помилка набагато ширша за це.

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

Убік, первинний ключ та особистість - це не одне і те ж. Стовпець ідентичності не є первинним ключем, якщо ви чітко не визначите його як такий, і ви, безумовно, можете мати первинний ключ, який не є стовпцем ідентичності.


-4

Якщо вам потрібно лише усунути останні рядки, які не дотримувались додаткового значення поля ідентичності, є простий і безпечний спосіб:

  1. спочатку видаліть останні записи, які "перескочили"
  2. змінити тип даних вашого поля ідентичності (з int на bigint або навпаки)
  3. збережіть таблицю
  4. додайте новий запис і перевірте, що він призначає номер найвищого значення + 1
  5. Замініть тип даних у вашому полі посвідчення особи, як це зручно для ваших потреб

і ви закінчили.


3
"Збережіть таблицю" не є значимим твердженням для SQL Server. Зміна типів даних може бути тривіальною з меншою ніж 100 рядків, але може виявитися дуже дорогою для великих таблиць.
Майкл Грін

2
Я припускаю, що ви маєте на увазі під SSMS. Це створить нову таблицю, скопіюйте всі рядки в неї, видаліть стару таблицю та перейменуйте нову. І вам потрібно зробити це двічі, щоб повернути тип даних назад. Це за допомогою кувалди для розтріскування горіха.
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.