Сброс и обновление identity столбца после удаления записей в SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Сброс идентификатора в SQL Server можно выполнить с помощью следующего кода:

SQL
Скопировать код
DBCC CHECKIDENT ('YourTable', RESEED, 0);

Данная команда позволяет обнулить значение идентификатора сразу после удаления записей из таблицы. Используйте 0, чтобы следующая запись получила идентификатор 1, или установите сид, соответствующий вашим требованиям.

Кинга Идем в IT: пошаговый план для смены профессии

Управление идентификационными данными в SQL Server

Проверка текущего идентификатора при помощи NORESEED

Если вам необходимо узнать текущее значение идентификатора, не изменяя его, используйте параметр NORESEED:

SQL
Скопировать код
DBCC CHECKIDENT ('YourTable', NORESEED);

Эта команда обеспечивает безопасный просмотр текущего значения идентификатора без его изменения, что поможет избежать ненужных изменений и последствий от них.

Управление ограничениями внешних ключей

Для надежного обеспечения непротиворечивости данных при изменении идентификатора, сначала необходимо вручную удалить ограничения внешних ключей, и затем восстановить их:

SQL
Скопировать код
ALTER TABLE ChildTable DROP CONSTRAINT Constraint1;  -- удаление ограничения

-- Обнуление идентификатора без риска нарушения целостности данных
DBCC CHECKIDENT ('ParentTable', RESEED, 0);

ALTER TABLE ChildTable ADD CONSTRAINT Constraint1 FOREIGN KEY (ParentID) REFERENCES ParentTable(ID); -- восстановление ограничения

Такие действия гарантируют, что вы избежите возможных проблем с целостностью данных, при условии, что идентификационный столбец используется как внешний ключ.

Сброс идентификатора для строк с NULL значениями

Есть ли в таблице строки с NULL значениями? Или вы только что удалили большое количество строк? Не беда!

SQL
Скопировать код
DBCC CHECKIDENT ('CleaningTheNulls', RESEED, 0);

В таких случаях счетчик идентификаторов обнуляется, и ваша таблица готова к добавлению новых записей с ненулевыми идентификаторами.

Очистка таблицы с помощью TRUNCATE

Хотите полностью очистить таблицу? Воспользуйтесь командой TRUNCATE:

SQL
Скопировать код
TRUNCATE TABLE MessyTable;

TRUNCATE – это мощная, более эффективная альтернатива команде DELETE. Она освобождает страницы данных и обнуляет идентификатор, что делает вашу таблицу, по сути, как новую.

Динамическое изменение идентификатора

Расчет нового значения идентификатора

Вместо жестко заданных значений лучше динамически расчитывать следующий идентификатор. Ваши данные будут вам благодарны:

SQL
Скопировать код
DECLARE @MaxID INT;  -- объявляем переменную
SELECT @MaxID = ISNULL(MAX(ID), 0) FROM MaxTable;  -- определяем максимальное существующее значение идентификатора
DBCC CHECKIDENT ('MaxTable', RESEED, @MaxID);  -- устанавливаем следующий идентификатор равным максимальному значению

Такой подход позволяет сохранить последовательность идентификаторов согласно максимальному текущему ID. Прощайте, пропуски!

Управление идентификатором в облачной среде

При необходимости управления идентификационными данными в облачной среде хорошо знать, что оператор DBCC CHECKIDENT также работает в облаке.

SQL
Скопировать код
-- Не волнуйтесь, используйте ту же команду в Azure SQL Database
DBCC CHECKIDENT ('CloudTable', RESEED, 0);

Визуализация

Представьте ряд ячеек, в которые мы ставим нумерованные шарики (🎱):

Markdown
Скопировать код
Исходное расположение: [01, 02, 03, 04, 05]

Ячейки 03 и 04 пустуют:

Markdown
Скопировать код
Текущее расположение: [01, 02, _, _, 05]

Сброс идентификатора до 2 приведет к тому, что следующий шар будет помещен в ячейку 03:

SQL
Скопировать код
DBCC CHECKIDENT ('LineTable', RESEED, 2);
Markdown
Скопировать код
Обновленное расположение: [01, 02, 🆕03, _, 05]

Так, из хаоса мы получаем упорядоченный набор без пропусков!

Настройка выходных сообщений

Подавление информационных сообщений

Если требуется чистый вывод или автоматическое выполнение скриптов, стоит освободиться от лишней информации:

SQL
Скопировать код
DBCC CHECKIDENT ('QuietTable', RESEED, 0) WITH NO_INFOMSGS;

Использование параметра WITH NO_INFOMSGS позволяет подавить все информационные сообщения и получить чистый, незагроможденный вывод.

Полезные материалы

  1. DBCC CHECKIDENT (Transact-SQL) – SQL Server | Microsoft Learn – официальное руководство Microsoft по сбросу идентификатора.
  2. IDENTITY (Property) (Transact-SQL) – SQL Server | Microsoft Learn – обзор работы свойства IDENTITY при создании таблиц в SQL Server.
  3. TRUNCATE TABLE (Transact-SQL) – SQL Server | Microsoft Learn – описание механизма обнуления счетчика идентификаторов с помощью команды TRUNCATE.
  4. DELETE (Transact-SQL) – SQL Server | Microsoft Learn – детальное обсуждение удаления строк из таблицы и взаимосвязи этого процесса с колонками для идентификации.