Что произойдет, когда автоинкремент столкнется с существующими данными в MySQL?

У меня есть таблица MySQL с автоинкрементным столбцом id. Идентификатор начинался с 1 и теперь находится в 4000.

Однако мне также необходимо перенести некоторые устаревшие данные в эту таблицу из старой версии приложения. Иды этих данных начинаются с 5000 и должны быть сохранены для целей аудита.

Что произойдет, если я вставлю запись после того, как мой счетчик автоинкремента достигнет 4999? Является ли автоинкремент достаточно умным, чтобы искать следующий доступный идентификатор, или он будет сбой, потому что он пытается вставить id 5000, который уже существует?

Хотя советы о том, как обойти эту проблему очень полезны, я также хотел бы понять, что MySQL будет делать в этой ситуации, и если мне нужно вмешаться вообще.

Ответ 1

Автоинкремент будет использовать следующий доступный идентификатор для таблиц InnoDB и MyISAM.

Я тестировал это для MySQL 4.1.22, работающего в Windows Vista. Я создал две простые таблицы, один из которых использует InnoDB, а другой - с помощью MyISAM. Каждый из них имел автоинкрементный первичный ключ с именем "id" и столбцом varchar, называемым "описание".

Я выполнил следующие команды (без ошибок):

INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert');
INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert');

SELECT * FROM MyIsamTest;

Я получил следующий результат, который показывает, что столбец "id" был правильно автоинкремент:

+=====+=========================+
| id  | description             |
+=====+=========================+
|   1 | autoincrement id insert |
+-----+-------------------------+
| 100 | manual id insert        |
+-----+-------------------------+
| 101 | autoincrement id insert |
+-----+-------------------------+

Я повторил эксперимент в моей таблице InnoDbTest с тем же результатом.

Ответ 2

Автоинкремент будет использовать следующий доступный идентификатор для таблиц InnoDB и MyISAM, но вы можете вручную изменить его следующую позицию следующим образом:

После вашей вставки вы можете установить для автоматического приращения значение, превышающее теперь самый высокий id:

ALTER TABLE tbl AUTO_INCREMENT = 9000;

Ответ 3

Если у вас есть только одна таблица устаревших без зависимостей от идентификаторов, то то, что я сделал бы, это создать временную таблицу для вставки всех ваших новых данных (с идентификаторами 5000+). Затем запустите это:

INSERT INTO `myrealtable` (column1, column2, column3)
SELECT column1, column2, column3
FROM `temptable`;

DROP TABLE `temptable`;

... где ни один из столбцов columnX не является основным идентификатором auto_increment.

Ответ 4

Попробуйте в тестовой базе данных и посмотрите, что происходит, с лампой /xampp и т.д.

Ответ 5

Я считаю, что MySQL проверяет, вставляете ли вы в автоинкрементный столбец и обновляете AUTO_INCREMENT, чтобы AUTO_INCREMENT > MAX (id), но мне нужно просмотреть документы. Вы все равно должны следовать за предложением Эндрю Даффи, чтобы быть в безопасности.

Ответ 6

MySQL не позволяет вам установить внутреннее значение auto_increment "значение" ниже текущего максимального ID.

Следовательно, если вы добавите 1000 строк, начинающихся с 5000, значение инкремента будет установлено на 6000. Вы можете добавить строки с идентификаторами, которые еще не существуют (например, 4500), но это не стоит беспокоить. Существует множество номеров от 6000 до 4 миллиардов.

Ответ 7

Если вы вставляете данные с уже назначенными первичными ключами в MyISAM, значение столбца AUTO_INCREMENT для следующей вставки будет макс (столбец) + 1, поэтому он будет работать.

Однако вы не используете MyISAM, так как это важные данные, вы используете InnoDB, которому нужен оператор ALTER TABLE, указанный выше.