質問

Microsoft SQL Server を使用しており、詳細の順序を保存する必要があるマスター/詳細シナリオがあります。したがって、Detail テーブルには ID、MasterID、Position およびその他の列があります。MasterID と Position にも一意のインデックスがあります。1 つの場合を除いて正常に動作します。既存の詳細があり、その順序を変更する場合。たとえば、位置 3 の詳細を位置 2 の詳細に変更した場合です。位置 2 (データベース内の位置は 3 に等しい) の詳細を保存すると、インデックスの一意性制約のため、SQL Server が抗議します。

この問題を合理的な方法で解決するにはどうすればよいでしょうか?

よろしくお願いします
ウカシュ・グラズ

役に立ちましたか?

解決

これは古典的な問題であり、答えは簡単です。項目 3 を位置 2 に移動したい場合は、まずソート列 2 を一時的な番号 (例:99)。したがって、次のようになります。

Move 2 to 99
Move 3 to 2
Move 99 to 3

ただし、一時値は通常の処理では決して使用されず、該当する場合は複数のスレッドを尊重することに注意する必要があります。

アップデート:ところで、「複数のユーザーが順序を変更している可能性がある」問題に対処する 1 つの方法は、私がしていることを行うことです。各ユーザーに数値 ID を与え、これを一時的な番号に追加します (私のスタッフ ID は、実際には、ログインをゲートするために使用されるスタッフ テーブルの一意の ID フィールド ID です)。したがって、たとえば、ポジションが決してマイナスにならない場合は、一時的な値として -1000 - UserID を使用できます。ただし、一つだけ信じてください。あなたがやる ない 衝突は絶対にないと仮定したいのです。そう思ったらもうひとつ する 問題が発生すると、デバッグが非常に困難になります。

アップデート:GUZ は、ユーザーがラインアイテムのセット全体を並べ替えてバッチとして送信した可能性があることを指摘しています。これは 2 つのレコードの単なる切り替えではありません。これには 2 つの方法のいずれかでアプローチできます。

まず、セット全体の既存の並べ替えフィールドを、衝突しない値の新しいセットに変更できます (例:-100 - (staffID * maxSetSize) +existingOrderVal) に基づいてレコードごとに移動し、各レコードを新しい順序値に変更します。

または、基本的に、orderVal 値が配列インデックスと同等の配列に対するバブル ソートのように扱うこともできます。これはあなたにとって完全に理にかなっている (そして明白です) か、解決策 1 に固執する必要があります (いずれにしても、解決策 1 の方が簡単です)。

他のヒント

あなただけのユニーク制約を削除(ただし、インデックスキーを残す)オーダー欄に、必要に応じて、あなたのコード内で一意性を保証できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top