2011-11-10 10 views
4

私はメッセージングシステムを作成しています(PHPを使用しています)、各メッセージにID番号を割り当てたいのですが(実際のメッセージには固有のID番号を付けています)、誰かがメッセージに返信したら、そのメッセージに返信されるメッセージと同じIDを与えることができます...もちろん、私は時間をかけてそれらをディスペンスして、順番に表示することができます。MySQLはauto_incrementをオーバーライドしますか?

フィールドを与えると、auto_incrementタイプは上書きできるタイプですか?

意味...新しいメッセージはそれぞれ自動値を持ちます。 1、2、3などですが、誰かが2番に返信するので、2のIDも必要です

これを行うには良い方法がありますか?

+6

別のフィールドを追加します。 'conversation_id'かそのようなものです。 auto_incrementは_unique_識別子用です。 – VolkerK

+1

「reply_id」という余分なフィールドを追加して、返信するメッセージのIDを追加してみませんか? – Flukey

+0

@VolkerKええ、どうやってIDに割り当てますか? –

答えて

9

AUTO_INCREMENT列に任意の値を割り当てることは絶対にありません。必要に応じて、テーブルカウンタがそれに応じて調整されます。

ただし、一意ではない列をAUTO_INCREMENTに設定することはできません。

正直、私はあなたのデザインを理解できません。典型的なメッセージングシステムは、次のようになります。

message_id in_reply_to 
========== =========== 
     1  NULL 
     2  NULL 
     3   1 
     4  NULL 
     5   1 
     6   3 
     7  NULL 

複製IDは、種類のIDを使用しての目的を打ちます。

更新#1: OMG、実際に特定の状況下で行うことができるようです:MyISAMテーブルの場合

あなたが複数列インデックスに二列 にAUTO_INCREMENTを指定することができます。この場合、 AUTO_INCREMENT列の生成値はMAX(auto_increment_column)+ 1 WHERE prefix = given-prefixとして計算されます。これは、データ を順序付けられたグループに入れる場合に便利です。

http://dev.mysql.com/doc/refman/5.5/en/example-auto-increment.html

更新#2:レコードの場合、私はちょうどそれをテストしてみたあなたにもInnoDBテーブル内の重複する自動インクリメントのIDを使用することができます。

CREATE TABLE foo (
    foo_id INT(10) NOT NULL DEFAULT '0', 
    bar_id INT(10) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (foo_id), 
    INDEX bar_id (bar_id) 
) 
ENGINE=InnoDB 
+0

ありがとう - ありがとう! –

+0

@DarrenSweeney - あなたがこのテーマに興味があるなら、リンク先のマニュアルページを読むことをお勧めします。私を含め、多くの人々が気付いていない 'AUTO_INCREMENT'については、多くの微妙な点があります。 –

+0

これは本当に面白いです。間違いなく私自身の知識のためにこれを読もうとしています。研究/テストのおかげで、@ÁlvaroG.Vicario –

1

いいえ、auto_increment列は複数回現れません。

+0

まさに私が言うつもりだった –

1

自動インクリメントでもuuidでも、私は各メッセージIDを一意にします。 thread_idのメッセージ構造体に追加の列を追加し、作成時に一意にしてから、すべての応答にこのthread_idを含めて論理的にそれらをリンクします。

1

あなたのテーブルには、parent_idと呼ばれる別の列があります。

元のメッセージのparent_idはNULLになります。

誰かがメッセージに返信すると、メッセージの元のIDは新しいメッセージのparent_id列に入ります。例えば:

id text   parent_id created_at 
============================================ 
1 'Lorem ipsum'  null   [time] 
2 'Lorem ipsum'  1   [time] 
3 'Lorem ipsum'  1   [time] 

あなたはさらに行くと返信が入れ子になったかもしれない:

id text   parent_id created_at 
============================================ 
1 'Lorem ipsum'  null   [time] 
2 'Lorem ipsum'  1   [time] 
3 'Lorem ipsum'  2   [time] 

を後者のケースでは、ネストされたメッセージのすべてを取得するには再帰関数のいくつかの並べ替えを必要とするだろうと思います;最初の方法は簡単です。

+0

ありがとう、ありがとう –

1

一意のIDを入れるのに最適な方法は、 uniqid(rand())を追加します。

関連する問題