2009-04-18 16 views
14

非常に頻繁に、そのユーザーに格納され、そのユーザーに関連付けられているユーザーをクエリしたい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' 

は、私は私の質問は理にかなって願っています!頻繁に出現するこの基本的なインサート・ノット・ディスカバリー・オペレーションまたは改善のための検出オペレーションを改善するにはどうすればよいですか?助けてくれてありがとう!

答えて

0

オラクルではMergeです。

MySqlについてのアイデアはありませんが、この用語はあなたに検索する何かを与えるかもしれません。

2

これは、UPSERT(UPの日付またはSERT)と呼ばれます。あなたがそれについて検索することができる多くのSOの質問があります。 See Wikipedia

EDIT:のMySQL 4.1以降がINSATEをサポートしている限り、あなたが主キーを持っているとして、あなたに同じことを得るべきである、(INS ERTまたはUPD をATE)。 MySQL Manual

1

私はそれを切り替える方が簡単だと思います。挿入してから更新してください。

MySQLは、具体的もちろんこれは、適切な一意キーのセットアップを持っているあなたを必要としDUPLICATE KEY UPDATE ON車(フィールド)VALUES(値)INTO

INSERT 'DUPLICATE KEY ON' 節...

を持っています。

0

私がどのように重複キー更新を使用したかの例: INSERT INTOレジストリ(名前、値)VALUES( '"。$ key。"'、。 "$ val。" ')重複キー更新値=「」$ valの。。 "'"

5

my other Stack Overflow answerから:

あなたは、単一のステートメントでこれを行うにしたい場合は、次のように、私は、INSERT ... ON DUPLICATE KEY UPDATE構文を使用することをお勧めします:

INSERT INTO table (id, someothervalue) VALUES (1, 'hi mom') 
    ON DUPLICATE KEY UPDATE someothervalue = 'hi mom'; 

最初のINSERTステートメントはe指定されたキー値(プライマリキーまたはユニークキー)を持つ既存のレコードが存在しない場合はxecuteします。レコードが既に存在する場合、次のUPDATEステートメント(someothervalue = 3)が実行されます。

これは、MySQLのすべてのバージョンでサポートされています。詳細はMySQL Reference Manual page for INSERT ... ON DUPLICATE KEY UPDATE

をご覧ください。
関連する問題