Что происходит, когда заканчивается автоинкрементный столбец?
Рассмотрим простую таблицу с столбцом с автоинкрементем следующим образом:
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, я хочу быть к ней готов.
Ответы
Ответ 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 (или минимальному значению) и выбросит ошибку для дублирующего ключа.