2016-07-27 1 views
0

は私が設定受信トレイのメッセージ(InnoDBの)テーブルを持っています。各行は個々のメッセージです。私は、 "conversation_id"という2番目の列を持っています。これは、送信者/受信者間のメッセージのグループのIDです。会話内のすべてのメッセージの会話ID番号は同じです。のMySQL:インサートマックス(COL)1 - 競合状態なし - 「idは」プライマリインデックス、自動インクリメントここでのメッセージの受信トレイ

問題:最大の「conversation_id」番号を見つけて、それに1(Max(col)+ 1)を追加して競合状態にならないようにするにはどうすればよいですか?競合状態は大きな問題です。なぜなら何百分もの人々が毎分メッセージを送信するからです。同時に複数のユーザーが同じメッセージを送信する場合、同じ「conversation_id」を要求したくないからです。

+0

代わりに独自の自動インクリメントプライマリキーを使用して 'conversations'テーブルを作成する方がよいでしょうか? 'conversations'の' id'を 'messages'の' conversation_id'として使うことができます。 'conversations'テーブルでは、単一のメッセージだけでなく、会話全体に関連する属性を保存することもできます。 –

+0

@Phil Ross - ありがとうございました!これは最もシンプルで最も強力なソリューションのようです。親切には – peppy

答えて

0

これは、質問の代わりに回答を求めるスタックオーバーフローの質問の典型的な例です。

あなたは「最大のconversation_id番号を見つけ、それに1を追加します(最大(COL)+ 1) - と競合状態を持っていない」ことができません。これはあなたがそれをやる方法ではありません。

代わりに、あなたの質問には、「それぞれの新しい行が一意のIDを受信して​​、そのIDが順番に並べられていることような方法で、テーブルに行を追加する方法。」でなければなりません

まともなRDBMSでこの問題を解決する正しい方法はSEQUENCEとして知られているものを使用することです。

MySQLはシーケンスをサポートしていません(。それを見て)ので、あなたは、MYSQLを使用する必要がある場合に利用できるソリューションは、アイデンティティ(「AUTO_INCREMENT」)の列です。 (参照してください)

+0

お返事ありがとうございます。私は、PhilRossの自動対話式conversation_idで2番目の「会話」テーブルを使用し、それを競合状態を防ぐために「メッセージ」テーブルで使用するという解決策を検討しました。 – peppy

関連する問題