Q:

Почему auto increment при использовании ON DUPLICATE KEY UPDATE прибавляет +1?

Имеется таблица
CREATE TABLE `report` (
    `id` INT(255) NOT NULL AUTO_INCREMENT,
    `checksum` VARCHAR(32) NOT NULL COLLATE 'utf8_general_ci',
    `created` INT(11) NOT NULL,
    `useragent` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
    `url` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
    `line` INT(10) NOT NULL,
    `error` LONGTEXT NOT NULL COLLATE 'utf8_general_ci',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `UNIQUE` (`checksum`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

чексумма не может повторяться в таблице.
И когда попадает повтор, должно ни чего не происходить
INSERT INTO report (checksum, created, url, line, error, useragent) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE created=created

И все работает четко, при появлении повтора ни чего не вносится, но почему то прибавляется +1 к Auto Increment, подскажите пожалуйста, с чем связана такая проблема.

A:

Это механизм движка: перед тем как вставить ищется следующий свободный ID в счетчике, обновляется. Дальше идет попытка вставить в таблицу, после обновить, но счетчик ID назад не откатывается. Поэтому использовать такой механизм хорошо на primary key отличном от чисел или без автоинкримента.
Вот с официальной документации (https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html):

If a table contains an AUTO_INCREMENT column and INSERT ... ON DUPLICATE KEY UPDATE inserts or updates a row, the LAST_INSERT_ID() function returns the AUTO_INCREMENT value.

