Кажется, работает нормально.Кажется, нет никаких проблем с SQL;похоже, он выполняет указанные операции;поведение, которое мы наблюдаем, точно такое же, как описано в документации Справочное руководство по MySQL.
При третьем выполнении изменения не применяются;результирующая строка будет точно соответствовать строке, которая уже сохранена.Таким образом, MySQL сообщает 0 row(s) affected
, и строка остается неизменной.
После первого выполнения:
product_code product_desc product_quantity product_sales product_group insert_time
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA AAA 1 1.55 TESTING $TEST time
После второго выполнения:
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA hello 124 3.05 TESTING hello
После третьего выполнения (ичетвертый, пятый, ...):
------------ ------------ ---------------- ------------- ------------- ----------
ZSHA hello 124 3.05 TESTING hello
Эти результаты в точности соответствуют ожиданиям.Не совсем понятно, зачем ожидать чего-то другого.(Может быть, мы не понимаем, что делает специальная функция VALUES()
?)
Вопрос заставляет нас гадать ... какое поведение наблюдается и какое поведение ожидается.Сказать, что это «не работает», почти бесполезно с точки зрения объяснения.
Если мы хотим добавить значение, указанное в предложении VALUES, к существующему значению в столбце ...
INSERT INTO ... ( ... , product_quantity , ... )
VALUES ( ... , '1' , ... )
ON DUPLICATE KEY
UPDATE product_quantity = IFNULL(product_quantity,0) + VALUES(product_quantity)
При возникновении исключения из дубликата ключа будет получено текущее значение столбца product_quantity
из строки.Если это ноль, мы возвращаем 0, в противном случае мы возвращаем значение, сохраненное в строке.Затем добавьте к этому значение, указанное в операторе INSERT для product_quantity.
Если мы не хотим, чтобы значение NULL перезаписывало текущее значение в столбце, мы можем также обернуть его в IFNULL или COALESCE
...
ON DUPLICATE KEY
UPDATE product_quantity = IFNULL(product_quantity,0) + IFNULL(VALUES(product_quantity),0)
Мы догадаемся о спецификации;угадать, что должен делать SQL, какое поведение мы хотим достичь.Без этого мы просто бросаем «пробовать этот» SQL без какого-либо определения того, удовлетворяет ли предложенный SQL спецификации.