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




sql online database (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) за время жизни приложения. Представьте, что вы вносите изменения в свой код и проверяете правильность установки ваших данных. Внезапно ваше приложение перестает работать с ошибкой выше. Вы откатываете изменения к известному хорошему коду, но ошибка не исчезнет ... очень расстраивает.

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

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


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