Domanda

Sto usando Microsoft SQL Server e ho uno scenario master-detail in cui ho bisogno di memorizzare l'ordine dei dettagli. Così nella tabella dettagliata che ho ID, MasterID, posizione e alcune altre colonne. V'è anche un indice univoco MasterID e posizione. Funziona male tranne un caso: quando ho alcuni dettagli esistenti e cambiare il loro ordine. Per esempio quando cambio un dettaglio in posizione 3 con un dettaglio sulla posizione 2. quando salvo dettaglio su posizione 2 (che nel database ha posizione uguale a 3) proteste di SQL Server, in quanto il vincolo di indice di unicità.

Come risolvere questo problema in un modo ragionevole?

Grazie in anticipo
Lukasz Glaz

È stato utile?

Soluzione

Questo è un classico problema e la risposta è semplice: se si desidera spostare il punto 3 alla posizione 2, è necessario innanzitutto modificare la colonna di ordinamento di 2 ad un numero temporaneo (ad esempio 99). Così va la vita in questo modo:

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

È necessario fare attenzione, però, che il valore temporaneo non viene mai utilizzato nella lavorazione normale e che si rispettano più thread, se applicabile.

Aggiorna : BTW - questione un modo per trattare con gli "utenti multipli può cambiare l'ordine" è quello di fare quello che faccio: dare ad ogni utente un ID numberical e poi aggiungerlo alla temporanea numero (il mio ID personale è in realtà il campo ID univoco di identità della tabella personale utilizzato per gli account di accesso del cancello). Così, per esempio, se le vostre posizioni non saranno mai negativo, si potrebbe utilizzare -1000 - UserID come valore temporaneo. Fidati di me su una cosa però: che fai non voglio supporre solo che non avrai mai una collisione. Se si pensa che e uno fa verifica, sarà estremamente difficile da eseguire il debug!

Aggiorna : GUZ sottolinea che i suoi utenti potrebbero avere riordinato tutta una serie di voci e presentato come una partita - non è solo un interruttore di due record. È possibile avvicinarsi a questo in uno dei due modi, allora.

In primo luogo, si potrebbe cambiare i campi di ordinamento esistenti l'intero set di una nuova serie di valori non-collisione (ad esempio -100 - (StaffID * maxSetSize) + existingOrderVal) e poi andare record per registrare e modificare ogni record al nuovo valore dell'ordine.

Oppure si potrebbe in sostanza trattano come una bolla sorta su un array in cui il valore orderVal è l'equivalente del vostro indice di array. O questo ha perfettamente senso per te (ed è ovvio), o si dovrebbe attaccare con la soluzione 1 (che è più facile, in ogni caso).

Altri suggerimenti

si può solo togliere il vincolo univoco (ma lasciare una chiave di indice) sulla colonna di ordine e garantire l'unicità nel codice, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top