Что происходит, когда заканчивается автоинкрементный столбец? - PullRequest
22 голосов
/ 12 декабря 2008

Рассмотрим простую таблицу со столбцом автоинкремента, подобную этой:

CREATE TABLE foo 
(
  `fooid` bigint unsigned NOT NULL auto_increment,
   ....snipped.... other columns
  PRIMARY KEY (`fooid`)
) 
ENGINE=InnoDB AUTO_INCREMENT=10

Как изменить дизайн так, чтобы мы не достигли максимума типа данных bigint? Диапазон без знака от 0 до 18446744073709551615. Я не знаю, сколько времени потребуется, чтобы достичь 18446744073709551615, но, как и проблема Y2K, я хочу быть к этому готовым.

Ответы [ 3 ]

57 голосов
/ 12 декабря 2008

Предположим, вы вставляете одну строку каждую миллисекунду.

18446744073709551615 миллисекунд = 18446744073709552 секунд = 307445734561826 минут = 5124095576030 часов = 213503982335 дней = 584942417 лет

Так что это не на самом деле как проблема Y2K

Вы можете вставить миллион строк в миллисекунду и все еще быть в порядке более 500 лет.

Другими словами: не беспокойтесь об этом.

18 голосов
/ 12 декабря 2008

В зависимости от того, какой режим SQL вы используете, MySQL делает одну из двух вещей, когда значение числового столбца AUTO_INCREMENT выходит за пределы диапазона. Вы получаете ошибку в любом случае, но по разным причинам.

В строгом режиме MySQL отклоняет значение вне диапазона, выдает ошибку недопустимого значения, и INSERT завершается ошибкой. В стандартном нестрогом режиме MySQL уменьшает значение до максимально допустимого для типа данных и выполняет INSERT. Но INSERT терпит неудачу, потому что атрибут AUTO_INCREMENT привел к тому, что все возможные значения уже используются, и вы получаете эту ошибку (неподписанный SMALLINT пример):

MySQL said:

#1062 - Duplicate entry '65535' for key 1

Для примера BIGINT замените «65535» на 18 квинтиллионов, хотя вряд ли эта ошибка когда-либо возникала в производственной базе данных.

Но с TINYINT s и SMALLINT s это может произойти очень легко, если вы недооцените возможные значения ключа (число INSERT s) в течение срока службы приложения. Представьте, что вы вносите изменения в свой код и проверяете, что ваши данные вставляются правильно. Внезапно ваше приложение перестает работать с ошибкой выше. Вы откатываете изменения в известный хороший код, но ошибка не исчезнет ... очень расстраивает.

2 голосов
/ 12 декабря 2008

Не знаю о MySQL, но в случае Postgresql вы можете указать, является ли последовательность CYCLE / NO CYCLE. Если он создан с параметром CYCLE, он снова вернется к 1 (или к минимальному значению) и выдаст ошибку для дублированного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...