Верхний предел для первичного ключа автоинкремента в SQL Server

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Каков верхний предел первичного ключа автоинкремента в SQL Server?Что происходит, когда первичный ключ автоинкремента SQL Server достигает верхнего предела?

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

Решение

Ответ Джоэла правильный: это верхний предел любого типа данных, который вы используете.

Вот пример двух из них:

  • интервал:2 ^ 31-1 (2 147 483 647)
  • биинт:2 ^ 63-1 (9 223 372 036 854 775 807)

Я фактически достиг предела на работе, над которой работал.Фактическая ошибка:

    Msg 8115, Level 16, State 1, Line 1
    Arithmetic overflow error converting IDENTITY to data type int.
    Arithmetic overflow occurred.

Есть пара исправлений, о которых я могу сразу подумать.Номер 1, вероятно, очень сложен и маловероятен, номер 2 прост, но, вероятно, вызовет проблемы в вашей кодовой базе.

  1. Если столбец идентификаторов для вас не имеет значения (это не внешний ключ и т. д.), вы можете просто повторно заполнить базу данных и сбросить столбец идентификаторов.
  2. Измените столбец идентификаторов на большее число.Например, если вы переполнили целое число, измените столбец идентификаторов на большое целое число.Удачи в этом :)

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

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

Это зависит от типа данных. Если вы используете bigint, вы вряд ли когда-нибудь переполнитесь. Даже обычный int дает вам пару миллиардов строк. Я никогда не переполнялся, поэтому я не могу сказать вам, что произойдет, если вы это сделаете.

Я расскажу вам, что происходит .... мои данные перестали вставляться в эту конкретную таблицу. База данных все еще работает, но я обнаружил, что данные отсутствуют и противоречивы. После небольшого исследования я нашел таблицу ошибок, а затем запустил ручную вставку. Ошибка такая же, как указано выше.

Пришлось изменить столбец на BIGINT. На базе данных объемом 26 ГБ на несколько медленном сервере это заняло около 30 минут. На архивной версии базы данных (150 ГБ или около того) это заняло немного больше времени.

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

Описание типов данных:

BIGINT    Integer data from -2^63 through 2^63 - 1

INT       Integer data from -2^31 through 2^31 - 1

SMALLINT  Integer data from -2^15 through 2^15 - 1

TINYINT   Integer data from 0     through 255

При достижении верхнего предела автоинкремент переходит в нижний предел.

DBCC CHECKIDENT (SomeTable, RESEED, 1)

Это сбрасывает идентификатор на 1 в таблице SomeTable

Не уверен, что это лучший способ сделать это.

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