![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
はじめまして。お世話になります。
LAMPでWEBシステムを作成しております。
ランダムな文字列をDBにINSERTする処理に関して質問させて頂きます。
条件:
・DBに入るランダムな文字列は重複不可。
・ランダムな文字列は[a-zA-Z0-9]の10桁とする。
・1度の処理で、ランダムの文字列は確実にINSERTさせる。
・同時に多数の処理が走ることがある。
・処理は速いに越したことない(DBの負荷も低めがよい)
環境:
PHP 4.4.4
Mysql 5.0.33
使用ストレージエンジン:MyIsam
私が思いついたのが以下の2通りです。
(1)
ランダム文字列が入るカラムをユニークキーとし、PHP側で作成されたランダム文字列をINSERT。
重複していたらエラーが返ってくるが、正常にINSERTされるまでPHP側でループ。
(2)
対象テーブルをロックし、PHP側で作成されたランダムの文字列をSELECT。
なければその文字列をINSERTし、テーブルロック解除
(1)はループが少し怖く、(2)はDBへの負荷がかかってしまいそうですが
どちらがよいでしょうか?
もしくは、他に何か方法があればご教授頂けるとありがたいです。
また、現在MyIsamを使用しておりますが、場合によってはストレージエンジンの変更も
考えておりますのでその点も考慮して頂けると幸いです。
ちなみに検索条件は、ランダムの文字列をキーに全てのデータを取得するくらいです。
そのテーブルは、カラム数15、レコード数1,000万の見込みです。
以上、長くなりましたがよろしくお願いします。
No.2ベストアンサー
- 回答日時:
予め、ランダムデータ用テーブルを1000万データ分作っておいて、
(まぁナンでしたら余裕をもって1億データくらいつくっておいてもよいかも)
新たにAUTO INCREMENTなどで振られたIDをもとに
そのテーブルからランダムデータを渡してあげればよいのでは?
ループでトライをする方式は場合によってはオーバーヘッドが
致命的になる場合もありますので。
メインテーブルにAUTO INCREMENT用テーブルが仕様上作成できないなら
ランダムデータ用テーブルの方にフラグフィールドをつくっておき
データを吐き出した時点でフラグをたてておけば、フラグのたってない
データを渡すというやり方も考えられます。
まぁランダム用テーブルをつくるにあたっては、ループでトライアンド
エラーでやることになりますが、データを作成するたびにトライするよりは
ずいぶんすっきりすると思います
この回答への補足
Mysqlの分野のほうが近いような気がしますので、一旦締め切ります。
改めまして、再度Mysql板のほうで質問させて頂きます。
ありがとうございました。
ご回答ありがとうございます。
ご提示頂いた実際の流れは、メインテーブルにINSERTする際にランダム文字列を取得する処理を考えた場合、
以下の流れでよろしいでしょうか?
[DB部]
ランダム文字列を格納するテーブルRAND_TBL(rand_seq_id int AUTO_INCREMET primary key, rand_id varchar(10) unique key)を作成、
必要分のデータををあらかじめ挿入。
メインテーブルMAIN_TBL(seq_id int AUTO_INCREMENT primary key, ....)作成
[処理部]
メインテーブルへデータを挿入後、
"SELECT rand_id FROM RAND_TBL WHERE seq_id = ".mysql_insert_id();で取得
また、ランダム文字列をキーにMAIN_TBLからデータを取得する際に少しめんどくさそうなので、
できればメインテーブルにもランダム文字列を入れたいのですが、その後UPDATEしかないのでしょうか?
PHPというより、Mysql分野に近くなってきましたが、何卒よろしくお願いします。
No.1
- 回答日時:
私なら、ユニーク文字列を
$id = md5 (uniqid (rand()));
として、32桁で返します。
実装が簡単ですよ。
参考URL:http://jp.php.net/manual/ja/function.md5.php
ご回答ありがとうございます。
ご提示頂いた
$id = md5 (uniqid (rand()));
としますと、完全に重複することはないのでしょうか?
可能性がわずかでもある場合は何かしらの処理が必要かと思われますので。
また、一応条件に、文字列は10桁(バイト数)とありますので、
できましたらこれに沿って頂けると助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) EXCEL の判定式をお教えください 3 2022/06/08 14:37
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Java Java 南京錠 2 2023/02/04 11:46
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- 数学 既存の数列のランダム性について(初歩的質問) 2 2022/06/07 20:04
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
php sqlite count 列数取得
-
forの中でforをループしてそれ...
-
phpにて出欠登録管理を作成して...
-
テーブルに行を追加
-
PHPの記述でSQLiteのテーブルに...
-
在庫数の取得
-
Accessへ日付をINSERT
-
@コスメのようにユーザーが採...
-
SQL Serverからのvarchar型のデ...
-
DBへ追加&更新 追加不能状態...
-
PHP初心者です。課題で九九表を...
-
変数にNULLを代入したい
-
エクセルをMysqlに格納
-
次の日
-
csvをDBへ読み込んだら、NULLが...
-
where文について
-
PHP+MySQLで、日時を比較して抽...
-
二つのテーブルから呼び出すには?
-
mysql_fetch_objectのエラー
マンスリーランキングこのカテゴリの人気マンスリー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エラーが対応出来ません。
おすすめ情報