非常に頻繁に、そのユーザーに格納され、そのユーザーに関連付けられているユーザーをクエリしたい1対1の関係。だから、(これは単なる例です)、私は車の情報と一緒にユーザの車を追跡するテーブルを持っているとしましょう。各ユーザーは0台または1台の車を所有できます。ユーザーに車がない場合、そのユーザーのテーブルにはエントリがありません。見つからない場合に行を挿入するためのMySQLの「良い」方法または見つかった場合は更新する
車テーブル(再び、単なる一例):だから 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')
}
「原子的に」機能する1つのエレガントなステートメントにするにはどうすればよいですか?別のプロセスでSELECT文とUPDATE文の間で行が削除された場合はどうなりますか?私のUPDATEステートメントは、INSERTステートメントが実行されるべき場所では失敗します。同じことを達成するために2つの同様の(しかし異なる)ステートメントを実行する必要があるように感じます。私が必要とするのは、自分の必要条件を満たす行が1行だけ必要なときに、私が望むデータがテーブルに存在することを保証する声明です。
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
その方法は、5のUSER_IDがすでに存在する場合、それが更新されますが、そうでない場合は、それが挿入されます。たとえば、それは(もちろんこれは全くされて作られたアップ)のようなものかもしれません。私は要件を変更した場合も、各ユーザが与えられたcar_makeのゼロまたは1つの車を持つことができると言っても、たとえば、私はさらにそれを指定することができます。
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
は、私は私の質問は理にかなって願っています!頻繁に出現するこの基本的なインサート・ノット・ディスカバリー・オペレーションまたは改善のための検出オペレーションを改善するにはどうすればよいですか?助けてくれてありがとう!