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