TL / DR: Да, но это почти не имеет значения.
Автоинкремент всегда увеличивается, поэтому он никогда не будет использовать отрицательные значения. С тем же успехом вы можете сделать его без знака и получить в два раза больший диапазон значений.
С другой стороны, если ваша таблица использует 2 31 значений, она, вероятно, также будет использовать 2 32 значений за короткое время, поэтому двойной диапазон значений isn ' большая разница. В любом случае вам придется перейти на BIGINT.
MySQL поддерживает необязательный тип данных SERIAL
(предположительно для совместимости с PostgreSQL, поскольку SERIAL
не является стандартным ANSI SQL). Этот тип данных просто сокращение, которое создает BIGINT UNSIGNED
.
Давай, попробуй:
CREATE TABLE test.foo (foo_id SERIAL PRIMARY KEY);
SHOW CREATE TABLE test.foo;
CREATE TABLE `test`.`foo` (
`foo_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`foo_id`),
UNIQUE KEY `foo_id` (`foo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Вы получаете одинаковое количество различных значений независимо от того, объявляете ли вы целое число со знаком или без знака: 2 32 для INT
и 2 64 для BIGINT
. Если число без знака, вы получаете значения от 0 до этого максимального значения минус один. Если число подписано, вы получаете значения от -max/2
до max/2-1
. В любом случае вы получаете одинаковое абсолютное количество различных значений.
Но поскольку AUTO_INCREMENT
начинается с нуля по умолчанию и увеличивается в положительном направлении, удобнее использовать положительные значения, чем отрицательные.
Но вряд ли имеет значение, что вы получаете в 2 раза больше положительных значений. Любая таблица, которая будет превышать максимальное целочисленное значение со знаком 2 31 -1, вероятно, будет продолжать расти, поэтому вам следует просто использовать BIGINT
для этих таблиц.
Вы действительно, действительно, действительно вряд ли выделите более 2 63 -1 значений первичного ключа, даже если вы удалите все свои строки и повторно загрузите их много раз день.