Insert ... on duplicate key update ничего не использует MySQL
моя проблема в том, что у меня есть несколько уникальных ключей на столе.
- Insert ignore не является опцией, поскольку он подавляет ошибки.
- MySQL не имеет поддержки для любого типа conditionals вне оператора (ex. если (cond), то вставить else не вставлять)
- хранимые процедуры не являются опцией (единственное место, где я могу использовать операторы if/else)
- 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;