
下記の通り同じデータが無かった場合に限りインサートしています。
//同じデータが既にあるか確認
$sql = "select * from `reg_data` where ";
$sql .= "`Date` = '".$date."' and ";
$sql .= "`ID` = '".$id."' and ";
$sql .= "`No` = '".$no."'";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
//データが0なら今日のレコード作成
if($rows == 0){
$sql = "insert into `reg_data` values('0', '".$date."', '".$id."', '".$no.")";
mysql_query($sql);
}
しかし、3%ぐらいの確立で重複インサートになってしまいます。
重複といっても
1個目のフィールドはAUTO_INCREMENTになっておりまして
AUTO_INCREMENTの値が重複する事は無いです。
$date、$id、$noがまったく同じテーブルがいくつか重複した場合でも
AUTO_INCREMENTの値は全て連番になっています。
重複インサートが発生しないよう改善するには
どうしたら良いでしょうか。
日付を2フィールド目に書いているので
0時0分1秒辺りでインサートが集中してしまいます。
分散させられたら改善するような気がしますが
いい案が思いつきません。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
Date, ID, No でユニークインデックスを作成して、DBに重複しないよう管理させてはどうでしょう。
CREATE UNIQUE INDEX idx_reg_data ON reg_data (Date, ID, No);
UNIQUE INDEXの詳しい利用方法を始めて知りました。
複数の組み合わせで
ユニークになるようにMySQLに管理させる事が出来るんですね
こんな便利な機能があったなんて・・・
教えて頂きありがとう御座います!
無事に実装でき、重複が無くなりました!
No.2
- 回答日時:
データベースの一意性保証の問題ですね。
質問者さんの問題は、「同じデータがあるか確認」してから、実際に「レコード作成」までの間に、他のプロセスあるいはスレッドの処理が入りこむケースでしょう。
あるデータが、データ確認からレコード作成するまでに、他のプロセスが「データ確認・レコード作成」の処理ができないように、例えばテーブルロックすれば、解決しますね。
もちろん、テーブルロックをすることで全体の処理速度は低下します。それが、許容できるかどうか?許容できるなら、それで解決ですが、許容できないレベルの速度低下となるなら、キー項目の持ち方を変えるなり、何かさらに対策を考えることになると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Pro*Cの構文エラー
-
JAVA SQLServerException 列名 ...
-
insert1つの処理でもトランザ...
-
PHPからデータベースに接続した...
-
MySQLでデータベースにデータin...
-
アラートでyes noを作りたいです。
-
円マークが付加されて保存され...
-
テキストボックスに入れた内容...
-
エラー3011
-
VBAをつかってクエリの情報を抽...
-
実行時エラー3131 FROM 句の構...
-
文字化け お名前comサーバー
-
sqlの検索結果件数を知りたい
-
csvをDBへ読み込んだら、NULLが...
-
PHPでMySQLデータを呼び出し、w...
-
LocalのNotesメールDBをVBAで参...
-
テーブルに入っているデータと...
-
SQL文が実行できません
-
MySQLでの売上集計
-
Accessのテーブルへ複数の主キ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
-
データベースに存在するデータ...
-
Pro*Cの構文エラー
-
insert1つの処理でもトランザ...
-
PHPからデータベースに接続した...
-
教えて下さい。
-
SQlite
-
プリぺアドステートメントで変...
-
コードで渡したデータを降順に...
-
VB勉強中
-
like検索の複数キーワードで、...
-
PHPよりMySQLの操作のコードの...
-
connectを使ったSQL実行でエラー
-
【PHP】CSVファイル内の文字列...
-
mysql php 複数のクエリ
-
PEARのgetOneでレコードが見つ...
-
ResultSetインターフェイスでの...
-
INSERT,DELETEを同時に
-
ODBC接続でデータ件数を求...
おすすめ情報