Архив

Публикации с меткой ‘identity out of scope’

Закончилось место под счетчик в таблице Integer IDENTITY runs out of scope

16 Январь 2012 Нет комментариев

Если у вас в таблице есть автоинкрементное поле, к примеру, типа int , и следующее автоинкрементное значение превышает максимальное значение для типа этого поля, не отчаивайтесь — это не беда :)

Такое происходит с большими таблицами, откуда часто удаляют и вставляют новые значения. Таким образом в нумерации имеются провалы из-за удаления данных, а максимальное значение для типа данных счетчика быстро достигается. Ошибка будет примерно такой такой:  Server: Msg 8115, Level 16, State 1, Line 2 Arithmetic overflow error converting IDENTITY to data type int. Arithmetic overflow occurred.

Варианты решения:

  1. Расширьте тип данных. Если у вас был int, поставьте bigint. Помните, если у вас значение этого поля использовалось в процедурах и прочем коде, вам придется их исправить на использование нового типа!
  2. Второй вариант ленивый. Если у Вас данные в таблице постоянно обновляются и есть большой кусок места до минимального значения счетчика( selectmin(auto_inc_field) fromyour_table) в этом поле, если смотреть от нуля, и если вы уверены, что если вы начнете нумерацию с нуля, то пока вы заполните этот промежуток, старые данные уже будут удалены, соответственно блок нумерации счетчика освободится, то этот вариант для Вас!   Вы можете элементарно начать нумерацию заново или с какого-то конкретного стартового номера следующей командой:
    DBCC CHECKIDENT ("your_table", RESEED, 1);
    GO

    Эта команда заменяет значение следующего автоинкрементного значение на 1. То есть, это есть замена текущего автоикремента.

     

  3.  Вариант для тех у кого есть время и в случае если строк в таблице меньше чем вариантов значений счетчика. Вариант один из наиболее надёжных. Создаете копию таблицы (желательно без индексов) и порциями копируете данные из старой таблицы в новую. Таким образом вы получаете все ваши данные с индексацией с нуля плотно упакованные относительно значений счетчика.
    Конечно, если у вас есть связанные таблицы по этому полю, Вам конечно ещё придется обновить старые значения счетчиков на новые.

Если есть вопросы или другие способы решения проблемы, то милости прошу, в коменты!

VN:F [1.9.13_1145]
Rating: 10.0/10 (1 vote cast)