Часто я хочу добавить значение в таблицу или обновить значение, если его ключ уже существует. Это может быть выполнено несколькими способами, предполагая, что первичный или уникальный ключ установлен в столбцах «user_id» и «pref_key» в примере:
1. Слепая вставка, обновите при получении ошибки дублирующего ключа:
// Try to insert as a new value
INSERT INTO my_prefs
(user_id, pref_key, pref_value)
VALUES (1234, 'show_help', 'true');
// If a duplicate-key error occurs run an update query
UPDATE my_prefs
SET pref_value = 'true'
WHERE user_id=1234 AND pref_key='show_help';
2. Проверьте наличие, затем выберите или обновите:
// Check for existence
SELECT COUNT(*)
FROM my_prefs
WHERE user_id=1234 AND pref_key='show_help';
// If count is zero, insert
INSERT INTO my_prefs
(user_id, pref_key, pref_value)
VALUES (1234, 'show_help', 'true');
// If count is one, update
UPDATE my_prefs
SET pref_value = 'true'
WHERE user_id=1234 AND pref_key='show_help';
Первый способ представляется предпочтительным, поскольку он требует только одного запроса для новых вставок и двух для обновления, тогда как для второго способа всегда требуются два запроса. Есть ли что-то, что я пропускаю, хотя это сделало бы плохую идею вслепую вставлять?