INSERT INTO... ON DUPLICATE UPDATE все значения

Могут ли я безопасно обновить все значения, подобные этому:

INSERT INTO tbl_name SET `a`=:a, `b`=:b, ... `z`=:z
ON DUPLICATE KEY UPDATE
`a`=VALUES(`a`), `b`=VALUES(`b`), ... `z`=VALUES(`z`);

Я пробовал это, и он работает. Но он тестировался только на одной таблице innodb.

Я нашел эти связанные вопросы 1, 2, 3, но не упоминается, что обновление всех столбцов (уникальных и/или pk) на 100% безопасно.

Он не создает никаких ошибок при обновлении ПК с одинаковым значением.
Он не создает никаких ошибок при обновлении Unique col с одинаковым значением.

Итак, безопасно ли это на 100%? Если нет, то какие угловые случаи, когда он ломается?

--------- изменить -------------
добавлено... до z col

Ответ 1

INSERT INTO … ON DUPLICATE KEY UPDATE работает следующим образом:

  • он пытается вставить строку как обычно
  • если происходит какое-либо нарушение ограничений в любом столбце, он выполняет оператор UPDATE вместо этого в существующей строке, с которой столкнулся оператор INSERT

Это просто означает, что если только оператор UPDATE будет успешным, его эквивалент ON DUPLICATE KEY UPDATE также будет работать. Это означает, что вы, очевидно, не можете нарушать какие-либо ограничения в инструкции UPDATE, либо все это не удастся (например, попытка установить значение в столбце UNIQUE, который уже существует в другой строке).

Если вы снова установите одно и то же значение в том же столбце, это практически не работает. Значение в столбце не изменяется и, следовательно, также не может вызывать каких-либо ошибок (предположим, что у вас нет действительно напуганных триггеров BEFORE UPDATE, которые могут плохо себя вести). Здесь количество столбцов не имеет значения, вы можете изменить как можно больше или меньше в одном из них.