Почему MySQL auto_increment пропускает числа - PullRequest
0 голосов
/ 06 сентября 2010

Мы выполняем импорт существующей таблицы продуктов в нашу собственную таблицу.Написанный нами скрипт импорта отлично работает и вставляет нужное количество строк (около 6000).Однако после импорта следующий автоматически увеличиваемый первичный ключ / идентификатор на 1500 записей (или около того) превышает количество строк в таблице.

Мы не можем понять, почему MySQL делает это, и мы хотелиэто остановить.Я делал обычные поиски в Интернете в поисках помощи, но я рисую пробел - есть идеи?

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Давайте возьмем эту простую таблицу, например:

CREATE TABLE `products` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(64) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

И файл импорта, который выглядит так:

"id","name"
1,"product 1"
2,"product 2"
5,"product 3"
102,"product 4"

Затем вы импортируете данные в оба столбца, поэтому механизм автоматического увеличения не работает. После импорта всех строк значение автоинкремента для таблицы устанавливается равным MAX (id) + 1 [ 103 в этом случае], чтобы следующий уникальный идентификатор автоинкрементации был уникальным. Если бы оно было равно числу вставленных строк, то следующим значением автоинкремента было бы 5, и оно совпадало бы со строкой № 3.

Если вы хотите, чтобы чистый начальный и последний идентификаторы были равны количеству строк, вам нужно либо избавиться от столбца «id» из файла .csv , либо создать таблицу без AUTO_INCREMENT для id , импортируйте данные и запустите этот простой sql:

SET @i=0;
UPDATE `products` SET id=@i:=@i+1 ORDER BY id;
ALTER TABLE `products`  CHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST;

Первый запрос устанавливает вспомогательную переменную, которая будет увеличиваться перед обновлением записи. Второй обновляет запись, чтобы иметь идентификатор, равный номеру строки. Третий изменит идентификатор столбца для автоинкремента и установит правильное значение для следующего автоиндекса.

Но перед изменением любых первичных ключей убедитесь, что они не используются ни в каких других таблицах в качестве внешних ключей!

0 голосов
/ 06 сентября 2010

Если вы выполните эту команду:

show create table Foo

Тогда вы увидите, что тоже установлено AUTO_INCREMENT=.Я предполагаю, что он не настроен на начало с 0.

Затем вы должны создать новую таблицу, чтобы AUTO_INCREMENT был установлен в 0 (или 1, я не могу вспомнить из головы).Это должно сработать.

...