Insert ... on duplicate key update ничего не использует MySQL

моя проблема в том, что у меня есть несколько уникальных ключей на столе.

  1. Insert ignore не является опцией, поскольку он подавляет ошибки.
  2. MySQL не имеет поддержки для любого типа conditionals вне оператора (ex. если (cond), то вставить else не вставлять)
  3. хранимые процедуры не являются опцией (единственное место, где я могу использовать операторы if/else)
  4. on duplicate key может обновить ключ с новым значением, но мне нужны уникальные ключи не изменять в случае отказа от ограничения unique.

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

2 ответов


если вы хотите ON DUPLICATE KEY UPDATE чтобы ничего не делать, просто установите значение столбца в существующее значение. Другие конфликты, такие как ограничения внешнего ключа, будут пузыриться, в отличие от использования IGNORE ключевое слово, но никакие значения не изменятся при конфликте.

INSERT INTO table (value1, value2) VALUES ('1', '2')
ON DUPLICATE KEY UPDATE value1 = value1;

если вы хотите, чтобы убедиться, что нет достоверных данных изменений в случае конфликта, вы можете добавить столбец с произвольными данными в таблице, и использовать это для UPDATE заявление.

третий вариант, если вы хотите держать всю логику в приложении, а не в базе данных, чтобы запустить SELECT заявление сначала проверить потенциальные конфликты перед запуском вашего INSERT/UDPATE заявление.

хотя это исключено для вашего сценария, хранимая процедура также сможет предоставить эту логику в одном вызове базы данных.


нашел другой вариант, если кто-то наткнется на эту проблему.

Если ваша таблица имеет автоинкрементный первичный ключ , вы можете обновить pk следующим образом:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;