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

StackOverflow https://stackoverflow.com/questions/262106

Вопрос

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

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

Это было полезно?

Решение

Вы получите ошибку переполнения при достижении максимального значения . Если вы используете тип данных 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 не предоставляет никаких функций для заполнения пробелов в идентификации, поэтому вам придется либо сделать это самостоятельно, либо изменить тип данных столбца идентификации.

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top