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

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

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

Ответы [ 6 ]

13 голосов
/ 04 ноября 2008

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

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

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

1 голос
/ 04 ноября 2008

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

1 голос
/ 04 ноября 2008

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

0 голосов
/ 21 августа 2009

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

0 голосов
/ 04 ноября 2008

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

0 голосов
/ 04 ноября 2008

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

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

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

...