Question

J'utilise Microsoft SQL Server et j'ai un scénario maître-détail où je dois stocker l'ordre de détails. Ainsi, dans la table Détail je ID, MASTERID, Position et quelques autres colonnes. Il y a aussi un index unique sur MASTERID et position. Il fonctionne bien, sauf un cas: quand j'ai quelques détails existants et je changer leur ordre. Par exemple, lorsque je change un détail sur la position 3 avec un détail sur la position 2. Lorsque j'enregistre les détails sur la position 2 (qui, dans la base de données a une position égale à 3) des manifestations SQL Server, car l'index contrainte d'unicité.

Comment résoudre ce problème d'une manière raisonnable?

Merci d'avance
Lukasz Glaz

Était-ce utile?

La solution

Ceci est un problème classique et la réponse est simple: si vous voulez déplacer le point 3 à la position 2, vous devez d'abord changer la colonne de tri de 2 à un numéro temporaire (par exemple 99). Donc, il va comme ceci:

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

Vous devez faire attention, cependant, que votre valeur temporaire est jamais utilisé dans le traitement normal et que vous respectez plusieurs threads le cas échéant.

Mise à jour : BTW - une façon de traiter la question des « multiples utilisateurs peut changer l'ordre » est de faire ce que je fais: donner à chaque utilisateur un ID numberical puis ajouter à la temporaire numéro (ma carte d'identité du personnel est en fait le champ identité unique ID de la table du personnel utilisé pour les connexions de porte). Ainsi, par exemple, si vos positions ne seront jamais négatives, vous pouvez utiliser -1000 - UserID comme valeur temporaire. Croyez-moi sur une chose que vous faites pas veulent simplement supposer que vous aurez jamais une collision. Si vous pensez que l'un et Finalité se, il sera extrêmement difficile de debug!

Mise à jour : GUZ souligne que ses utilisateurs ont peut-être réorganisées un ensemble complet d'éléments de ligne et les a soumis en tant que lot - il est non seulement un commutateur de deux dossiers. Vous pouvez aborder cette question de deux façons, alors.

D'abord, vous pouvez modifier les champs de tri existants de l'ensemble complet à un nouvel ensemble de valeurs non-entrer en collision (par exemple -100 - (StaffID * maxSetSize) + existingOrderVal) et ensuite enregistrement par enregistrement et modifier chaque enregistrement à la nouvelle valeur de la commande.

Ou vous pouvez essentiellement le traiter comme une sorte de bulle sur un tableau où la valeur orderVal est l'équivalent de votre index de tableau. Soit cela a un sens parfait pour vous (et est évidente) ou vous devriez en tenir à la solution 1 (qui est plus facile en tout cas).

Autres conseils

vous pouvez simplement supprimer la contrainte unique (mais laisser une clé d'index) sur la colonne de commande, et d'assurer l'unicité dans votre code si nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top