はじめまして。
ユニークキー設定しているカラムに、
SELECTして取得できない場合、INSERTの処理をすると
違うセッションでタイミングによってINSERTがエラーになってしまうと思います。(以下参照)
--------------------------------------
時間 SESSION1 SESSION2
↓ SELECT→×
↓ SELECT→×
↓ INSERT→○
↓ INSERT→×
--------------------------------------
この様な場合、SESSION2を生かすには、その後SELECTを再度実行すればよいと思うのですが、他によい方法はないのでしょうか?
何かございましたら、ご教授お願いいたします。
各バージョン
MySQL5.0
(PHP5.1)
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
SELECTして取得できないとか・・・なにか難しいことを
考えているような感じなので、
簡単な具体例をあげてみたほうが良いと思います。
具体的な例として、以下を準備します。
--------------------------------------------
create table t1(
id int auto_increment primary key,
value varchar(10),
unique (value)
);
insert into t1 (value) values ('a');
--------------------------------------------
まず
select id from t1 where value = 'a';
としたときに、idは取得できます。
次に、
select id from t1 where value = 'b';
とした場合、結果がありませんので、
insert into t1 (value) values ('b');
select last_insert_id();
とします。
そこで、違う2つのセッションでほぼ同時に
select id from t1 where value = 'c';
がされた場合、
片方は
insert into t1 (value) values ('c');
select last_insert_id();
が成功しますが、もう一方はinsertできません。
最終的に取得したいものは、id(auto_increment)ですので、
取得するには、insertが失敗した方で、再度
select t1 where value = 'c';
をしないといけません。
結構このようにしたい場合はあると思うのですが、
いい方法を知りません。
何かありましたら、ご教示していただけますとうれしいです。
No.3
- 回答日時:
ん~だから最初に書いたとおりINSERT IGNORE INTOで問題ないのでは?
SESSION1
insert ignore into t1 (value) values ('b');
select id from t1 where value = 'b';
SESSION2
insert ignore into t1 (value) values ('c');
select id from t1 where value = 'c';
たとえばこれが
insert ignore into t1 (value) values ('b');
insert ignore into t1 (value) values ('c');
select id from t1 where value = 'b';
select id from t1 where value = 'c';
でも結果はおなじですよね?
こういうことがやりたいのではないのですか?
(仮にすでにvalueにbやcがあれば、insert処理が無視されるので
なんの問題もないです)
ご回答ありがとうございます。
なるほど。初めのSELECTを省くということですか。
その場合、毎回INSERTを流すことになると思いますが、実際にINSERTされない場合は、
それほどサーバに負荷はかからないと考えてよろしいでしょうか?
そうであれば、問題ないと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
1テーブル&複数レコードの更新...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
mysqlのdeleteのサブクエリーで...
-
Updateの複数テーブル条件時のL...
-
バインド変数について
-
VIEWの元のテーブルのindexって...
-
sqlで、600行あるテーブルを100...
-
select文のwhere句に配列を入れ...
-
ある条件の最大値+1を初番する...
-
[MySQL] UNIQUE制約の値を更新...
-
SQLサーバから、項目の属性(型...
-
DataTableで重複行を削除したい
-
Access パラメータクエリをcsv...
-
単純なクエリーなのにSELECTし...
-
Yahoo .comの idには年齢制限、...
-
マイクラPC版のコマンドで効率...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
select文のwhere句に配列を入れ...
-
マイクラPC版のコマンドで効率...
-
SQLサーバから、項目の属性(型...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] 3つのテーブルの結合で...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
ストアドのエラーについて
-
Unionした最後にGROUP BYを追加...
-
バインド変数について
-
PL/SQLの変数について
-
sqlで、600行あるテーブルを100...
-
WordpressのContact form 7でzi...
-
selectした大量データをinsert...
-
inner joinをすると数がおかし...
おすすめ情報