- ベストアンサー
テーブルのアイテム番号を一意にするには?
今PHPとデータベースを使ってメールの送受信をするというものを作っています。 テーブルの主キーはu_id(そのメールを送信または受信したユーザ)と、m_id(一意のメールの番号)です。 m_idに一意の番号をつけていくにはどうしたらいいのでしょうか? ・メールを削除することも出来ます。 ご回答の程よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
m_idは「番号」と言うことですから数値型ですよね? 一意であれば良いのでしたら削除による抜けは気にしなくて良いのでは? LONG型で1づつ加算される数値だとしたら1日10万通以上送っても100年はもちます。 やり方としてよく見かけるのは、番号付与用のテーブルを別に作って現在の最大番号を入れておき、そのテーブルから次に使える最大番号得る方法です。 注意点としては番号付与用のテーブルの排他制御を必ず行なうこと。 複数人が同時アクセスする可能性のあるWebアプリですので、複数人がたまたま同じタイミングで更新してしまった時に排他制御をしていないと同じ番号が得られてしまい一意でなくなってしまいます。 番号付与用のテーブルを作らずにSELECT文のMAX関数でm_idの最大値をとってくるやり方もありますが、タイミングにより一意でなくなる可能性がありますのでおすすめしません。 もしもm_idが文字型であれば、もっと簡単です。 m_id=メールアドレス+年月日時分秒+適当な乱数 としておけば一致することはまずありません。
その他の回答 (4)
- syuuiwsd
- ベストアンサー率56% (17/30)
#1です。 ごめんなさい、serialを間違いました。
- yambejp
- ベストアンサー率51% (3827/7415)
メールのIDですからMessage-Idをキーすれば十分じゃないですか? メールをやり取りをした際の階層構造にもつかえるので、データは 保持するはずですから。
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
私の場合、PostgreSQLだとsereal型ですが、MySQLですと、ほとんどの場合ユニークキーになる物は int(11) NOT NULL auto_increment としてテーブルを作成しています。自動的に作成されるのでまったく気にしなくていいわけです。 既にテーブルが有り、移行が困難と言う事でしたら、もしDB接続にPEARをつかって居ればPEAR DB システムの nextId() メソッドを使うのが楽です。 参考まで。
- syuuiwsd
- ベストアンサー率56% (17/30)
ご使用になるデータベースは何でしょうか? MySQLなら、m_idを主キーにして、serial型にすれば一意的になるわけです。 u_idを主キーにするのはちょっと危険だと思います。同じユーザが二度とメールを送信したら主キーが重複してしまうのでしょうか。
補足
使用しているデータベースはMySQLです。 u_idとm_idの両方を主キーにしようと考えているのでたぶん重複は大丈夫だと思います。 調べたらserial型はPostgreSQLだと書いてあったのですがMySQLでも出来るのですか?
補足
LONG型で1づつ加算される数値というのはPHPでnextId()を使うということでしょうか? それともlong型のm_idをAUTO_INCREMENTにするということでしょうか?