Подтвердить что ты не робот

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

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

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, я хочу быть к ней готов.

4b9b3361

Ответ 1

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

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

Так что это не очень похоже на проблему Y2K

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

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

Ответ 2

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

Ответ 3

Не знаю о MySQL, но в случае Postgresql вы можете указать, является ли последовательность ЦИКЛОМ/НЕТ ЦИКЛА, Если он создан с помощью параметра CYCLE, он снова вернется к 1 (или минимальному значению) и выбросит ошибку для дублирующего ключа.