- ベストアンサー
INSERT文とUPDATE文の使い分け
いつもお世話になっております。 MYSQLで x_table ID SUBID 1 aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
MySQLだとして、キーが全てユニークならON DUPLICATE KEY UPDATE句でINSERTをUPDATE代わりには使えます。 重複値の生成を招くレコードが挿入される場合だけなので、使い方には注してください。 http://dev.mysql.com/doc/refman/4.1/ja/insert.html
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
考え方次第ですが >存在する場合はUPDATE、存在しない場合はINSERT というのは、存在するときもしないときもINSERT してから UPDATEするのと同等です。 ただし、INSERT IGNORE INTO・・・つまり存在してもインサートする (実際には存在すればエラーでインサートされない)という 書式をつかうと解決します
お礼
お返事ありがとうございます。 INSERT IGNORE INTO・・・ UPDATE ・・・ と二つ続けてSQLを発行し、INSERT出来なかった場合は無視してUPDATEという事でしょうか? IGNOREというコマンドも知らずマニュアルで調べたのですが、考え方が面白いですね。 ただ要件不足で申し訳ありません、今回はテーブル内のID及びSUBIDがユニーク値では無いため(プライマリキーは別に持ってます)、INSERTはいつでも成功してしまいます。 でも、このようなやり方もある事を教えて頂く事が出来たので是非次に生かさせて頂きます。 ありがとうございます。 あと・・・ >存在するときもしないときもINSERT してから UPDATEするのと同等です。 上記を参考に #最初にUPDATE+WHEREを実行し、実行に失敗した場合はINSERT if(!mysql_query( #UPDATE文とWHERE )){ mysql_query( #INSERT文 ) } という形で最初のレコード存在確認のSELECTを省けそうです。 お返事ありがとう御座いました。
- Hardking
- ベストアンサー率45% (73/160)
replaceコマンドがあります。 replace into テーブル名 (フィールド1, フィールド2...) values (値1, 値2...);
お礼
お返事ありがとうございます。 要件不足で申し訳御座いません、今回、ID及びSUBIDに両方、重複可の項目のため(わかりづらい質問で申し訳無いです)、REPLACEでは対応出来なさそうですが、「REPLACE」というコマンド自体知らなかったため新しい世界が開けました。 特定のユニークキーに基づいて追加・または更新したい場合などに便利そうですね。 是非今後の参考とさせて頂きます。 お返事ありがとうございました。 もう少し様子を見たいため、本日はこの質問について「締め切り」とはせず、明日改めて「締め切り」とさせて頂きます。
お礼
お返事ありがとうございます。 要件不足で申し訳御座いません。 データベースはMYSQLで、ID及び、SUBIDの項目については重複可、ID及びSUBIDが指定した値と一致した場合のみ、UPDATE処理をしたく考えております。 ON DUPLICATE KEY UPDATEについて提示して頂いたURLを拝見したのですが、INSERTやUPDATEについて基本の挿入・更新しか知らなかったので、このような便利なコマンドもあるのかと目から鱗でした。 今後使用する場面もあるかと思うので是非参考とさせて頂きます。 お返事ありがとうございました。