下記の通り同じデータが無かった場合に限りインサートしています。
//同じデータが既にあるか確認
$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で質問しましょう!
似たような質問が見つかりました
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- MySQL #1062 - '0' は索引 'PRIMARY' で重複しています。とでています。 1 2023/01/01 06:13
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
insert1つの処理でもトランザ...
-
ResultSetインターフェイスでの...
-
<VB.NET>INSERT文でDBにデータ...
-
CakePHPとMySqlを使用していま...
-
配列をループさせてUPDATE
-
order by での変数使用について。
-
Q&Aサイトを作成していてURLの...
-
sqliteの構造体
-
JAVA SQLServerException 列名 ...
-
VBAをつかってクエリの情報を抽...
-
MySQLでデータベースにデータin...
-
phpのエラーについてです
-
BLOBでの画像表示について
-
PHPで[]の使い方について
-
sqlから多次元配列に要素を格納...
-
sortable ギブアップです…助け...
-
エラー3011
-
php テーブルを作れない
-
テーブルに入っているデータと...
-
PHP と MySQL でテーブルの行数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
<VB.NET>INSERT文でDBにデータ...
-
データベースに存在するデータ...
-
ResultSetインターフェイスでの...
-
C# で発生したException.Messag...
-
Q&Aサイトを作成していてURLの...
-
VBA ACCESS SQL...
-
MySQLのINSERT時にたまに重複に...
-
INSERT,DELETEを同時に
-
【初歩】配列の格納データ数だ...
-
PHP&MySQLでの文字列+数列の一...
-
php postgres Insert と updat...
-
VB.NET エラーになる箇...
-
OR検索を実装したい
-
PHP初心者です。syntax error, ...
-
mysqliを使ってデータベースを...
-
like検索の複数キーワードで、...
-
CakePHPとMySqlを使用していま...
おすすめ情報