2011-11-10 68 views
4

我正在创建一个消息系统(使用PHP),并且想要为每条消息分配一个ID号(除了每条具有唯一ID号的实际消息)......但是,如果有人回复了消息,那么我想能够给该消息提供与正在回复的消息相同的ID ...那么我当然可以按时显示它们并按顺序显示它们。MySQL覆盖auto_increment?

所以,如果我给这个领域的auto_increment类型是能够被覆盖?

含义...每个新消息具有自动值,例如, 1,2,3等,但有人回复2号,所以它的ID也需要2

或者是否有更好的方法来做到这一点?

+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 - 如果您对这个主题感兴趣,我建议您阅读手册页I链接。很多人都没有意识到“AUTO_INCREMENT”的许多细节,包括我在内。 –

+0

这真的很有趣。绝对要根据我自己的知识来阅读。感谢您的研究/测试,@ÁlvaroG.Vicario –

1

不,auto_increment列不能出现多次。

+0

正是我要说的 –

1

我会保持每个消息ID唯一 - 无论是通过自动增量还是通过uuid。在消息结构中为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())。