
いつもお世話になっております。
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ランキング
-
文字列に対してPHP上で一括置き...
-
クエリObjectをforeachで回す時...
-
mysql+php 日付別料金データで...
-
PhpMyAdmin
-
MDB2エラーが対応出来ません。
-
csvからの取込み
-
MySQLでデータベースにデータin...
-
画像をDBに登録する方法
-
OracleからAccessへのインポート
-
pearのdisconnect()が使えない。
-
DB(MySQL)から複数行のデータを...
-
会員登録したらメールが送られ...
-
CSVをダウンロードさせた際、CS...
-
PHPからSQLite3のUPDATEができ...
-
「日付条件」のDELETEで...
-
LocalのNotesメールDBをVBAで参...
-
PHPによるMySQLクエリ文の操作...
-
mysql php ループ列の行の値を...
-
ACCESSを用いたデータベースで...
-
php MySQL で、更新ボタンを押...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
csvをDBへ読み込んだら、NULLが...
-
変数にNULLを代入したい
-
カラムにデータがあるかないか...
-
ヒアドキュメントでSQLを書く事...
-
3つのテーブルを結合したSELECT文
-
MYSQLのレコードの数を表示した...
-
PHPでPostgreSQLのテーブルを表...
-
php sqlite count 列数取得
-
クエリObjectをforeachで回す時...
-
OracleからAccessへのインポート
-
PHP PDOを利用してカラムの削除...
-
DB Error: no such field
-
テーブルを使用してレイアウト...
-
PHPシステムでSQLのUPDATEがあ...
-
テーブルのカラムの属性を変え...
-
重複データをカウントするのに...
-
変数を組み入れたい
-
phpでテーブルを作る際変数によ...
-
phpの掲示板でレスがあったスレ...
おすすめ情報