MySQL INSERT ON DUPLICATE KEY UPDATE ... вернуть "затронутые строки: 1", но никаких изменений на самом деле нет - PullRequest
8 голосов
/ 18 апреля 2019

Я создаю таблицу со столбцом, имеющим значение по умолчанию '1'

create table int_1 (
  id int not null auto_increment,
  value int default 1,
  primary key (id)
);

команда

insert into int_1 values(1, null) on duplicate key update value = null;

всегда возвращать результат

1 row(s) affected

но запись действительно изменилась (вставлена) после первого выполнения. Но если я создаю таблицу со значением по умолчанию '0', все работает как положено:

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;

Возвращение

0 row(s) affected

после второго запуска «вставить дубликат ключа»

Проверено на MySQL 5.7, 8.0

Есть ли объяснение этому поведению?

Ответы [ 2 ]

6 голосов
/ 24 апреля 2019

При ON DUPLICATE KEY UPDATE значение затронутых строк на строку равно 1 , если строка вставляется как новая строка, 2 , если существующая строка обновляетсяи 0 , если для существующей строки заданы ее текущие значения.Если вы укажете флаг CLIENT_FOUND_ROWS для функции API mysql_real_connect () C при подключении к mysqld, значение затрагиваемых строк будет равно 1 (не 0), если для существующей строки заданы текущие значения.

- https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

2 голосов
/ 23 апреля 2019

Это интересная вещь, которую я недавно обнаружил и в 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 засчитывается как строка, на которую "влияет" вставка.Я считаю, что это поведение, которое вы видите.

...