Массовая вставка запроса mysql вызвала разрыв в последовательности

У меня есть запрос к строкам select и insert в таблице с автоинкрементным столбцом в качестве ключа.

insert into table a select * from table B

Я обнаружил, что после выполнения запроса в столбце автоинкремента в table B есть пробел в последовательности.

Возможно ли это? Или мой оператор выбора не смог вставить некоторые записи??

Пожалуйста помоги.

Я не могу воспроизвести этот случай, так как это рабочий сервер, и у меня нет резервной копии перед выполнением запроса.

Большое спасибо.


person user2665145    schedule 08.08.2013    source источник
comment
Я считаю, что это может произойти, если вы делаете откат при вставке. ( dev.mysql.com/doc/refman /5.1/ru/ ) Вы можете увидеть пробелы в последовательности значений, присвоенных столбцу AUTO_INCREMENT, если вы откатываете транзакции, которые сгенерировали числа с помощью счетчика.   -  person SubSevn    schedule 08.08.2013


Ответы (1)


Если вы используете InnoDB с INSERT IGNORE, вы можете прочитать эту статью, в которой говорится об этой проблеме:

Отказ от автоматического увеличения дыры в InnoDB с помощью INSERT IGNORE

Почему у нас пробелы?

InnoDB проверяет счетчик auto_increment в таблице и, если требуется новое значение, увеличивает этот счетчик и присваивает новое значение столбцу. До MySQL 5.1.22 InnoDB использовала метод доступа к этим значениям счетчика, который назывался «Традиционный». Здесь используется специальная блокировка таблицы, называемая AUTO-INC, которая остается до конца запроса или транзакции. Из-за этого два запроса не могут иметь блокировку AUTO-INC одновременно, поэтому мы теряем параллелизм и производительность. Проблемы еще хуже с длинными запросами, такими как INSERT INTO table1 … SELECT … FROM table2.

При использовании простой вставки из select существует известная ошибка.

В заключение я бы не сказал, что это проблема с вашим запросом, но больше связано с тем, как движок обрабатывает вставку из выбранных блоков.

person Filipe Silva    schedule 08.08.2013
comment
Спасибо. мой запрос просто вставляется без игнорирования, и запрос представляет собой пакетный запуск, в то же время не должно выполняться никаких других запросов. Извините, я совсем новичок в sql. - person user2665145; 08.08.2013
comment
В этом есть известная ошибка. У вас есть несколько insert from select? - person Filipe Silva; 08.08.2013