Это интересная вещь, которую я недавно обнаружил и в MySQL 5.7.Если вы намеренно попытаетесь вставить уже существующую строку, используя при обновлении дубликата ключа, этот запрос также будет дублировать число затронутых строк.
Например, запустите эти запросы:
CREATE TABLE int_0 (
id INT NOT NULL AUTO_INCREMENT,
VALUE INT DEFAULT 0,
PRIMARY KEY (id)
);
INSERT INTO int_0 VALUES(1, NULL) ON DUPLICATE KEY UPDATE VALUE = NULL;
Затем выполните это:
INSERT INTO int_0 VALUES(1, 2) ON DUPLICATE KEY UPDATE VALUE = 2;
Этот запрос покажет «затронуты 2 строки», хотя есть только 1Строка в таблице и, следовательно, влияет на 2 строки.
Моя теория состоит в том, что он пытается подсчитать количество строк, затронутых вставкой и обновлением, а затем сложить их вместе.Каким-то образом триггер ON DUPLICATE KEY UPDATE
засчитывается как строка, на которую "влияет" вставка.Я считаю, что это поведение, которое вы видите.