Очень часто я хочу выполнить запрос для одного из моих пользователей, где я хочу, чтобы строка сохранялась и ассоциировалась с этим пользователем в отношении 1: 1. Допустим (это просто произвольный пример), что у меня есть таблица, которая отслеживает автомобиль пользователя, а также некоторую информацию об автомобиле. У каждого пользователя может быть 0 или 1 машина. Если у пользователя нет автомобиля, в таблице нет записи для этого пользователя.
Таблица
автомобилей (опять же, просто пример):
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'
Надеюсь, мой вопрос имеет смысл! Как я могу улучшить эту базовую операцию вставки, если не найден или обновить, если найден, которая возникает так часто? Спасибо за любую помощь!