Что происходит в SQL 2005, когда заканчивается число для столбца автонумерации?

Что произойдет, если SQL Server 2005 достигнет максимума для столбца IDENTITY? Начинается ли он с самого начала и начинает восполнять пробел?

Как ведет себя SQL Server 2005, когда это происходит?


person Maxime Rouiller    schedule 04.11.2008    source источник


Ответы (6)


При достижении максимального значения вы получите сообщение об ошибке переполнения. Если вы используете тип данных bigint с максимальным значением 9,223,372,036,854,775,807, это, скорее всего, никогда не произойдет.

Сообщение об ошибке, которое вы получите, будет выглядеть так:

Msg 220, Level 16, State 2, Line 10
Arithmetic overflow error for data type tinyint, value = 256.

(Источник)

Насколько я знаю, MS SQL не предоставляет функций для заполнения пробелов в идентификаторах, поэтому вам придется либо сделать это самостоятельно, либо изменить тип данных столбца идентификаторов.

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

Вот хороший пост в блоге на эту тему.

person xsl    schedule 04.11.2008

Он не заполнит пробелы. Вместо этого вставки не будут выполняться до тех пор, пока вы не измените определение столбца, чтобы либо удалить идентификатор и найти какой-либо другой способ заполнения пробелов, либо увеличить размер (перейти от int к bigint) или изменить тип данных (от int до decimal). ), чтобы было доступно больше значений идентификаторов.

person tvanfosson    schedule 04.11.2008

Вы не сможете вставлять новые строки и будете получать сообщение об ошибке, указанное выше, пока не устраните проблему. Вы можете сделать это несколькими способами. Если у вас все еще есть данные и вы используете все идентификаторы ниже максимального, вам придется изменить тип данных. Если данные регулярно очищаются и у вас есть большой пробел, который не будет использоваться, вы можете повторно установить идентификационный номер до наименьшего числа в этом пробеле. Например, на предыдущей работе мы регистрировали транзакции. У нас было, может быть, 40-50 миллионов в месяц, но мы очищали все, что старше 6 месяцев, поэтому каждые несколько лет идентичность приближалась к 2 миллиардам, но у нас не было ничего с идентификатором ниже 1,5 миллиарда, поэтому мы повторно заполняли вернуться к 0. Опять же возможно, что ни один из них не будет работать для вас, и вам придется найти другое решение.

person Kevin    schedule 04.11.2008

Если столбец идентификаторов является целым числом, то ваше максимальное значение равно 2 147 483 647. Вы получите ошибку переполнения, если превысите его.

Если вы считаете, что это риск, просто используйте тип данных BIGINT, который дает вам до 9 223 372 036 854 775 807. Невозможно представить таблицу базы данных с таким количеством строк.

Дальнейшее обсуждение здесь. (Та же ссылка, что и xsl).

person BradC    schedule 04.11.2008

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

person Logicalmind    schedule 04.11.2008

Если вы время от времени удаляете «старые значения», вам просто нужно сбросить начальное значение с помощью DBCC CHECKIDENT («MyTable», RESEED, 0);

person Community    schedule 21.08.2009
comment
DBCC CHECKIDENT («MyTable», RESEED, -2147483647) потенциально может помочь, если вы уже заполнили строки 0-2147483647;) - person keithl8041; 15.07.2015