Могу ли я безопасно обновлять все значения, например:
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
INSERT INTO … ON DUPLICATE KEY UPDATE
работает следующим образом:
UPDATE
вместо существующей строки, с которой столкнулось заявление INSERT
Это просто означает, что если только оператор UPDATE
будет успешным, его эквивалент ON DUPLICATE KEY UPDATE
также будет работать. Это означает, что вы, очевидно, также не можете нарушать какие-либо ограничения в UPDATE
, или все это не удастся (например, попытка установить значение в столбце UNIQUE
который уже существует в другой строке).
Если вы снова установите одно и то же значение в том же столбце, это по существу не-op. Значение в столбце не изменяется и, следовательно, также не может вызывать никаких ошибок (предположим, что у вас нет действительно BEFORE UPDATE
триггеров BEFORE UPDATE
которые могут плохо себя вести). Количество столбцов здесь не имеет значения, вы можете изменить столько или несколько в одном из операторов, сколько хотите.