みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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を一つにまとめる事が出来るようなやり方って無いでしょうか?

無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

投稿日時 - 2009-02-01 21:13:47

QNo.4681083

困ってます

質問者が選んだベストアンサー

MySQLだとして、キーが全てユニークならON DUPLICATE KEY UPDATE句でINSERTをUPDATE代わりには使えます。
重複値の生成を招くレコードが挿入される場合だけなので、使い方には注してください。
http://dev.mysql.com/doc/refman/4.1/ja/insert.html

投稿日時 - 2009-02-01 21:52:29

お礼

お返事ありがとうございます。
要件不足で申し訳御座いません。
データベースはMYSQLで、ID及び、SUBIDの項目については重複可、ID及びSUBIDが指定した値と一致した場合のみ、UPDATE処理をしたく考えております。

ON DUPLICATE KEY UPDATEについて提示して頂いたURLを拝見したのですが、INSERTやUPDATEについて基本の挿入・更新しか知らなかったので、このような便利なコマンドもあるのかと目から鱗でした。
今後使用する場面もあるかと思うので是非参考とさせて頂きます。
お返事ありがとうございました。

投稿日時 - 2009-02-01 22:36:13

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

考え方次第ですが

>存在する場合はUPDATE、存在しない場合はINSERT

というのは、存在するときもしないときもINSERT してから UPDATEするのと同等です。
ただし、INSERT IGNORE INTO・・・つまり存在してもインサートする
(実際には存在すればエラーでインサートされない)という
書式をつかうと解決します

投稿日時 - 2009-02-02 09:40:06

お礼

お返事ありがとうございます。
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を省けそうです。
お返事ありがとう御座いました。

投稿日時 - 2009-02-02 15:42:30

ANo.1

replaceコマンドがあります。
replace into テーブル名 (フィールド1, フィールド2...) values (値1, 値2...);

投稿日時 - 2009-02-01 21:51:08

お礼

お返事ありがとうございます。
要件不足で申し訳御座いません、今回、ID及びSUBIDに両方、重複可の項目のため(わかりづらい質問で申し訳無いです)、REPLACEでは対応出来なさそうですが、「REPLACE」というコマンド自体知らなかったため新しい世界が開けました。
特定のユニークキーに基づいて追加・または更新したい場合などに便利そうですね。
是非今後の参考とさせて頂きます。
お返事ありがとうございました。

もう少し様子を見たいため、本日はこの質問について「締め切り」とはせず、明日改めて「締め切り」とさせて頂きます。

投稿日時 - 2009-02-01 22:45:15

あなたにオススメの質問