Почему 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, подскажите пожалуйста, с чем связана такая проблема.
Ответы (1 шт):
Это механизм движка: перед тем как вставить ищется следующий свободный 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.