![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
いつもお世話になっております。
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を一つにまとめる事が出来るようなやり方って無いでしょうか?
無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。
No.2ベストアンサー
- 回答日時:
MySQLだとして、キーが全てユニークならON DUPLICATE KEY UPDATE句でINSERTをUPDATE代わりには使えます。
重複値の生成を招くレコードが挿入される場合だけなので、使い方には注してください。
http://dev.mysql.com/doc/refman/4.1/ja/insert.html
お返事ありがとうございます。
要件不足で申し訳御座いません。
データベースはMYSQLで、ID及び、SUBIDの項目については重複可、ID及びSUBIDが指定した値と一致した場合のみ、UPDATE処理をしたく考えております。
ON DUPLICATE KEY UPDATEについて提示して頂いたURLを拝見したのですが、INSERTやUPDATEについて基本の挿入・更新しか知らなかったので、このような便利なコマンドもあるのかと目から鱗でした。
今後使用する場面もあるかと思うので是非参考とさせて頂きます。
お返事ありがとうございました。
No.3
- 回答日時:
考え方次第ですが
>存在する場合は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を省けそうです。
お返事ありがとう御座いました。
No.1
- 回答日時:
replaceコマンドがあります。
replace into テーブル名 (フィールド1, フィールド2...) values (値1, 値2...);
お返事ありがとうございます。
要件不足で申し訳御座いません、今回、ID及びSUBIDに両方、重複可の項目のため(わかりづらい質問で申し訳無いです)、REPLACEでは対応出来なさそうですが、「REPLACE」というコマンド自体知らなかったため新しい世界が開けました。
特定のユニークキーに基づいて追加・または更新したい場合などに便利そうですね。
是非今後の参考とさせて頂きます。
お返事ありがとうございました。
もう少し様子を見たいため、本日はこの質問について「締め切り」とはせず、明日改めて「締め切り」とさせて頂きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Oracle SQL update方法 2 2022/06/22 14:07
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- PHP php エラー 2 2022/10/23 16:43
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- PostgreSQL SQLでUPSERTを一度に複数行やる方法 3 2022/03/25 15:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
csvをDBへ読み込んだら、NULLが...
-
PHPでいいね機能を作りたいので...
-
ランダム文字列をDBにINSERT
-
MDB2エラーが対応出来ません。
-
phpにて出欠登録管理を作成して...
-
PHPでフォームからデータDBに書...
-
データをDBからひっぱってき...
-
forの中でforをループしてそれ...
-
カラムにデータがあるかないか...
-
SELECT文の加工(日付/時刻型)
-
INSERT,DELETEを同時に
-
phpでmysqlを使ってデータベー...
-
エラー3011
-
実行時エラー3131 FROM 句の構...
-
JAVA SQLServerException 列名 ...
-
phpで複数の検索語を検索対象に...
-
テキストボックスに入れた内容...
-
sortable ギブアップです…助け...
-
PHP と MySQL でテーブルの行数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
トランザクション処理
-
MySQLでデータベースにデータin...
-
PHPシステムでSQLのUPDATEがあ...
-
変数にNULLを代入したい
-
phpにて出欠登録管理を作成して...
-
csvをDBへ読み込んだら、NULLが...
-
php sqlite count 列数取得
-
クエリObjectをforeachで回す時...
-
PHPでフォームからデータDBに書...
-
DB Error: no such field
-
日またぎの計算
-
OracleからAccessへのインポート
-
PHPでいいね機能を作りたいので...
-
PHP PDOを利用してカラムの削除...
-
PHPでPostgreSQLのテーブルを表...
-
SQLで返り値が空とでる
-
PHP prepare フィールド名をエ...
-
PHPでmySQLのテーブルを作成したい
-
外部結合で参照列が複数あるSQL
-
MDB2エラーが対応出来ません。
おすすめ情報