Frage

Ich bin mit Microsoft SQL Server und ich habe ein Master-Detail-Szenario, in dem ich die Reihenfolge der Details speichern muß. So in der Detail-Tabelle Ich habe ID, MasterID, Position und einige andere Spalten. Es gibt auch einen eindeutigen Index für MasterID und Position. Es funktioniert OK außer einem Fall: wenn ich einige vorhandene Details haben und ich ihre Reihenfolge zu ändern. Zum Beispiel, wenn ich auf Position 3 mit einem Detail auf Position ein Detail ändern 2. Wenn ich speichern Detail auf Position 2 Protesten SQL Server (die in der Datenbank Position gleich 3 hat), weil der Index Eindeutigkeitsbedingung.

Wie man dieses Problem in einer angemessenen Art und Weise lösen?

Vielen Dank im Voraus
Lukasz Glaz

War es hilfreich?

Lösung

Dies ist ein klassisches Problem und die Antwort ist einfach: Wenn Sie Artikel 3 in die Position verschieben möchten 2, zuerst die Sortierspalte von 2 auf eine temporäre Nummer ändern müssen (z 99). So ist es so geht:

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

Sie müssen vorsichtig sein, aber, dass Ihr temporärer Wert nie in der normalen Verarbeitung verwendet wird, und dass Sie mehrere Threads ggf. respektieren.

Aktualisieren : BTW - ein Weg, um mit den umgehen Problem „Mehrere Benutzer können die Reihenfolge sich ändern“ ist zu tun, was ich tun: jeder Benutzer eine nummerische ID geben und diese dann in den temporären Nummer (meine Mitarbeiter ID ist eigentlich die eindeutige Identität Feld-ID aus dem Lehrertisch zu Gate-Logins verwendet). So zum Beispiel, wenn Sie Ihre Positionen nie negativ sein werden, könnten Sie -1000 verwenden - UserID als temporären Wert. Vertrauen Sie mir auf eine Sache aber: Sie tun nicht will nur davon ausgehen, dass Sie nie eine Kollision haben werden. Wenn Sie denken, dass und eine nicht auftritt, wird es extrem schwer zu debuggen sein!

Aktualisieren : GUZ weist darauf hin, dass seine Anwender eine ganze Reihe von Positionen neu geordnet haben und übermittelt sie als Batch - es ist nicht nur ein Schalter von zwei Datensätzen ist. Sie können dies auf zwei Arten in einem Ansatz dann.

Erstens könnten Sie die vorhandenen Sortierfelder des gesamten Satzes an einem neuen Satz von nicht-kollidierende Werte ändern (zB -100 - (StaffID * maxSetSize) + existingOrderVal) und dann Rekord-by-Rekord gehen und jeden Datensatz ändern auf den neuen Auftragswert.

Oder man könnte es im Wesentlichen behandeln wie eine Blase Art auf einem Array, wo der orderVal Wert entspricht Ihren Array-Index ist. Entweder macht Sinn für Sie (und liegt auf der Hand) oder Sie sollten Stick mit Lösung 1 (die auf jeden Fall einfacher ist).

Andere Tipps

Sie könnten nur die eindeutige Einschränkung entfernen (aber einen Indexschlüssel verlassen) in der Größenordnung Spalte und gewährleisten im Code Einmaligkeit, wenn nötig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top