Что вы делаете, когда ваш первичный ключ переполняется?

У нас есть таблица с первичным ключом auto-increment int , максимальное значение которого сейчас находится на пределе для типа T-SQL. Когда мы пытаемся повторно засеять таблицу (потому что в ключах есть большие пробелы, почти не хватает строк в качестве значения max int ), она каким-то образом сбрасывается до значения max int .

Очевидно, это создает серьезные проблемы. ПК никогда не должен был получать это значение, и изменение типа данных было бы большой задачей. Повторного посева должно быть достаточно, но оно не работает!

Как он мог бы сбрасываться?

Изменить: чтобы прояснить ситуацию, этот запрос SELECT MIN(CategoryID), MAX(CategoryID) FROM dbo.tblCategories возвращает -2147483647, 2147483647 … означает, что существуют фактические значения PK при минимальном и максимальном значениях типа int .

Вы можете «reseed» таблицы, чтобы столбец следующего назначенного идентификатора был меньше текущего максимального значения в таблице. Тем не менее, любой подстрочный DBCC CHECKIDENT вернет внутренний счетчик обратно к максимальному значению, которое в настоящее время находится в столбце. Возможно, именно здесь происходит сброс? И, конечно же, вставка в конечном итоге попадет в дублирующее значение, в результате чего в «Интересные времена» появится команда поддержки производства.

В общем, у вас проблемы. Я рекомендую разработать одноразовый скрипт для удаления / сброса значений идентификатора uber-high. Обновление строк (и всех связанных значений внешнего ключа) является одним из вариантов, хотя это связано с необходимостью отключить ограничения внешнего ключа, и я не знаю, что все остальное, поэтому я бы не рекомендовал его. Другим было бы создание точных копий всех данных для элементов с высоким идентификатором, используя более прагматические значения идентификатора, а затем удалять исходные записи. Это взлом, но это приведет к значительно более удобной базе данных.

О, и отследите людей, которые ввели эти высокие значения id и, по крайней мере, отменили их права доступа к базе данных.

Я был вовлечен в проект, у которого была аналогичная проблема, хотя в нашем случае кто-то выбрал поле с 4-значным номером в качестве первичного ключа, который вроде бы не работал, когда мы приблизились к 9999 записям …

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

Очень грязно, но это сработало.

Создайте новую таблицу с той же структурой. Читайте от старого к новому (за исключением ПК). Затем удалите старый и переименуйте новое.

  • Как выбрать кластерный индекс в SQL Server?
  • Использование существующего ключа кандидата или нового составного ключа для первичного ключа
  • Первичные ключи в базе данных протоколирования
  • Sql Server: uniqueidentifier plus integer compound PK ... какой тип индекса использовать?
  • Создание первичного ключа и идентификатора после загрузки данных
  • Использование первичного ключа в переменной таблицы для повышения эффективности поиска
  • Не удается найти, какая строка вызывает ошибку преобразования
  • Как я могу добавить ALTER COLUMN к NOT NULL, когда индексируется столбец
  • Индекс по умолчанию для основного ключа
  • Почему сортировка записей в таблице не соответствует кластерному индексу?
  • Почему select SCOPE_IDENTITY () возвращает десятичное число вместо целого?
  • Давайте будем гением компьютера.