0

SQLで注文番号を生成するとします。通常、次の番号は

SELECT COUNT(numbers)+1 FROM X

問題は、最初にこの番号をユーザーに提供し、次にユーザーが内容を入力するのを待ってから、テーブルに挿入することです。しかし、複数のユーザーがいるので、番号を取得することもできますが、最初のユーザーと同じ数ですが、これをよりエレガントに行う方法はありますか?すぐに私は番号を特定のユーザーに予約し、彼がそうしない場合はそれを挿入したいのですが、そうでない場合は、番号を解放するだけです。

4

3 に答える 3

4

数字の表を作成します。テーブルに値を事前入力し、このテーブルをキューとして使用します。トランザクションは、行をデキューすることで Number を予約できます。ロールバックすると、番号は再び使用可能になります。using-a-table-as-queue の readpast セマンティクスにより、他のトランザクションが同時に他の番号をデキューできます。必要に応じて数字を追加 (行を挿入) します。

これがやり過ぎだと思われる場合でも、ご安心ください。そうではありません。単純な解決策は、解決するのが簡単ではない並行性またはロールバックを説明できない場合があります。

于 2013-02-04T11:54:01.437 に答える
0

システムにギャップなしですべての番号を順番に持つ必要がない場合は、IDタイプの列を含む単純なテーブルを作成できます。そのため、偽のレコードを挿入し@@IDENTITY、生成された番号として使用します。もちろん、このソリューションには、RemusRusanuが「ナイーブなソリューション」について述べたようにいくつかの欠点があります。

可能であれば、実際にデータベースに保存する前に、この番号をユーザーに表示しないようにしてください。日付と時刻などの一時的な参照用に抽象番号を生成できます。データベースにデータを挿入した後、実数を表示できます。コーディングするものはほとんどありませんが、100%信頼できます。

于 2013-02-04T15:08:19.793 に答える
0

テーブルに挿入し、ユーザーがデータをコミットしたときに更新することができます。

数字の「解放」を回避するには、次のようにします。行が「空いている」かどうかを示すフラグをテーブルに置きます。最初に挿入したとき、フラグは「無料ではありません」です。ユーザーがデータをコミットする場合は、「無料ではない」として保持します。

彼らが彼らの番号を解放するならば、それを「無料」としてマークしてください。

ユーザーに番号を割り当てるときに、最初の「空き」行を見つけます。番号がない場合は、新しい行を挿入します。

于 2013-02-04T12:30:43.097 に答える