Почему MySQL auto_increment пропускает числа

0

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

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

  • 0
    Вы вставляете какие-либо данные в автоинкрементный столбец?
  • 0
    Нет. Мы оставляем автоинкремент делать это "вещь".
Показать ещё 1 комментарий
Теги:
database
import
autocomplete
mysqlimport

2 ответа

1

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

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 и было бы colide с строкой № 3.

Если вы хотите, чтобы чистый старт и последний id равны количеству строк, вам нужно либо избавиться от столбца "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;

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

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

  • 0
    +1 за отличный ответ, но проблема не в этом. Мы запускаем импорт и создаем наш собственный, автоинкрементный первичный ключ. Импорт приносит 6000 (или около того записей) с последовательными идентификаторами. Следующий автоматический идентификатор должен быть 6001, но вместо этого мы получаем 7500 (скажем).
  • 2
    Если это так, то единственное, что приходит на ум, - это проверить, действительно ли они последовательны - пробовали ли вы SELECT MAX(id) FROM products после импорта данных или ALTER TABLE products ORDER BY id и смотрите, есть ли в последних строках предсказанные значения?
Показать ещё 1 комментарий
0

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

show create table Foo

Затем вы увидите, что установлен параметр AUTO_INCREMENT=.
Я предполагаю, что он не настроен на запуск с 0.

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

  • 0
    Спасибо за ваше предложение, но AUTO_INCREMENT установлен в 1 и работает не только сразу после большого импорта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню