• ベストアンサー

テーブルのアイテム番号を一意にするには?

今PHPとデータベースを使ってメールの送受信をするというものを作っています。 テーブルの主キーはu_id(そのメールを送信または受信したユーザ)と、m_id(一意のメールの番号)です。 m_idに一意の番号をつけていくにはどうしたらいいのでしょうか? ・メールを削除することも出来ます。 ご回答の程よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#41855
noname#41855
回答No.2

m_idは「番号」と言うことですから数値型ですよね? 一意であれば良いのでしたら削除による抜けは気にしなくて良いのでは? LONG型で1づつ加算される数値だとしたら1日10万通以上送っても100年はもちます。 やり方としてよく見かけるのは、番号付与用のテーブルを別に作って現在の最大番号を入れておき、そのテーブルから次に使える最大番号得る方法です。 注意点としては番号付与用のテーブルの排他制御を必ず行なうこと。 複数人が同時アクセスする可能性のあるWebアプリですので、複数人がたまたま同じタイミングで更新してしまった時に排他制御をしていないと同じ番号が得られてしまい一意でなくなってしまいます。 番号付与用のテーブルを作らずにSELECT文のMAX関数でm_idの最大値をとってくるやり方もありますが、タイミングにより一意でなくなる可能性がありますのでおすすめしません。 もしもm_idが文字型であれば、もっと簡単です。 m_id=メールアドレス+年月日時分秒+適当な乱数 としておけば一致することはまずありません。

owlet37
質問者

補足

LONG型で1づつ加算される数値というのはPHPでnextId()を使うということでしょうか? それともlong型のm_idをAUTO_INCREMENTにするということでしょうか?

その他の回答 (4)

  • syuuiwsd
  • ベストアンサー率56% (17/30)
回答No.5

#1です。 ごめんなさい、serialを間違いました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

メールのIDですからMessage-Idをキーすれば十分じゃないですか? メールをやり取りをした際の階層構造にもつかえるので、データは 保持するはずですから。

回答No.3

私の場合、PostgreSQLだとsereal型ですが、MySQLですと、ほとんどの場合ユニークキーになる物は int(11) NOT NULL auto_increment としてテーブルを作成しています。自動的に作成されるのでまったく気にしなくていいわけです。 既にテーブルが有り、移行が困難と言う事でしたら、もしDB接続にPEARをつかって居ればPEAR DB システムの nextId() メソッドを使うのが楽です。 参考まで。

  • syuuiwsd
  • ベストアンサー率56% (17/30)
回答No.1

ご使用になるデータベースは何でしょうか? MySQLなら、m_idを主キーにして、serial型にすれば一意的になるわけです。 u_idを主キーにするのはちょっと危険だと思います。同じユーザが二度とメールを送信したら主キーが重複してしまうのでしょうか。

owlet37
質問者

補足

使用しているデータベースはMySQLです。 u_idとm_idの両方を主キーにしようと考えているのでたぶん重複は大丈夫だと思います。 調べたらserial型はPostgreSQLだと書いてあったのですがMySQLでも出来るのですか?

関連するQ&A