Очень часто мне нужно выполнить запрос для одного из моих пользователей, где я хочу, чтобы строка сохранялась и ассоциировалась с этим пользователем в отношении 1-к-1. Итак, скажем (это всего лишь произвольный пример), что у меня есть таблица, которая отслеживает автомобиль пользователя, а также некоторую информацию об автомобиле. Каждый пользователь может иметь либо 0, либо 1 автомобиль. Если у пользователя нет автомобиля, для этого пользователя нет записи в таблице.
таблица cars (опять же просто пример): id, user_id, car_make, car_model
Итак, когда я обновляю эту таблицу, я всегда делаю что-то вроде этого (псевдокод):
result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}
Как я могу превратить это в одно элегантное утверждение, которое работает «атомарно»? Что произойдет, если в другом процессе будет УДАЛЕН ряд между операторами SELECT и UPDATE? Моя инструкция UPDATE завершится ошибкой там, где должна была выполняться инструкция INSERT. И я чувствую, что мне нужно сделать два похожих (но разных) утверждения, чтобы выполнить одно и то же! Мне нужно какое-то утверждение, которое убедит меня, что нужные мне данные существуют в таблице, особенно когда мне нужна только 1 строка, удовлетворяющая моему требованию. Например, это может быть что-то вроде (это, конечно, полностью выдумано):
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
Таким образом, если user_id из 5 уже существует, он будет обновлен, в противном случае он будет вставлен. Кроме того, если бы я изменил требования, например, чтобы сказать, что каждый пользователь может иметь ноль или одну машину данного car_make, то я мог бы дополнительно указать, что:
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
Надеюсь, мой вопрос имеет смысл! Как я могу улучшить эту базовую операцию «вставить, если не найдено» или «обновить, если найдено», которая возникает так часто? Спасибо за любую помощь!