2016-07-27 56 views
0

我有一个收件箱邮件(innodb)表设置其中“id”是主索引,自动递增。每一行都是一个单独的消息。我有第二个名为“conversation_id”的列,它是发件人/收件人之间的一组邮件的ID。会话中的所有消息将具有相同的conversation_id号码。MySQL:插入最大(col)+1 - 没有竞争条件 - 邮件收件箱

问题:我该如何做一个MySQL插入,我找到最大的“conversation_id”数字并且给它加1(Max(col)+ 1) - 并且没有竞争条件?竞争条件是一个大问题,因为数百人每分钟都会发送消息,并且如果同时发送消息,我不希望多个用户声称相同的“conversation_id”。

+0

用它自己的自动递增主键代替创建'conversations'表可能更好吗?然后,您可以使用来自conversations的'id'作为'messages'中的'conversation_id'。 “会话”表格还可以让您存储与整个对话相关的任何属性,而不仅仅是一条消息。 –

+0

@Phil Ross - 非常感谢!这似乎是最简单和最强大的解决方案。亲切的问候 – peppy

回答

0

这是一个问题答案而不是问题的一个典型的stackoverflow问题的例子。

你不能“找到最大的conversation_id号并加1(Max(col)+ 1) - 并且没有竞争条件”。这不是你应该怎么做的。

相反,您的问题应该是“如何将行添加到表中,以便每个新行都接收一个唯一的ID,并使ID按顺序排列。”

在任何体面的RDBMS中解决这个问题的正确方法是使用所谓的SEQUENCE。 (查找它)

MySQL不支持序列,因此如果您必须使用MYSQL,则可用的解决方案是标识(“auto_increment”)列。 (查看它。)

+0

感谢您的回应。我已经提出了Phil Ross的解决方案,即使用第二个“会话”表并使用自动增加的conversation_id表,然后在“消息”表中使用它来防止竞争状况! – peppy