2010-11-23 9 views
1

En supposant que j'ai plus de 1000 enregistrements ou même plus. La seule façon de penser à cela est de mettre à jour toutes les positions d'enregistrement. Disons que j'ai une colonne appelée "position", 1, 2, 3, 4, 5, etc.MYSQL - Modification de l'ordre de l'enregistrement de données

Disons que l'utilisateur souhaite déplacer la position de l'enregistrement "5" pour après enregistrement "2", à Pour ce faire, je dois mettre à jour l'enregistrement "5" pour enregistrer "3", enregistrer "3" pour enregistrer "4", et enregistrer "4" pour enregistrer "5".

Existe-t-il une autre façon de procéder? Cela semble exagéré quand vous avez beaucoup d'enregistrements.

Merci!

+0

Quelle est la clé primaire? La signification de votre question sera plus claire à partir de la structure de votre table. –

+0

position n'est pas la clé primaire, j'ai le nom de la colonne appelée "uid" comme clé primaire. – dpark

Répondre

0

Plutôt que d'avoir un champ supplémentaire que vous utilisez pour trier les données, introduisez une clé étrangère NextItem. Vous pouvez conserver les clés primaires originales des éléments. La clé primaire agit toujours comme une valeur d'identification, mais n'a rien à voir avec l'ordre de tri.

Vous pouvez avoir ceci:

ID: 33, Name: The first item, NextItem: 48 
ID: 48, Name: The second item, NextItem: 12 
ID: 12, Name: The last item, NextItem: NULL 

Maintenant, tout ce que vous devez faire pour re-commander vos données est de changer le « nextItem » d'un seul enregistrement.

+0

Idée intéressante, mais: Comment identifiez-vous le "premier" article? Étant donné le «premier» article, comment commandez-vous les articles en utilisant cette méthode? Compte tenu de votre exemple, je ne vois aucun moyen de le faire, du moins pas avec une requête SQL. –

+0

Mais n'ai-je pas encore besoin de mettre à jour chaque enregistrement pour positionner l'enregistrement dans un certain ordre? – dpark

0

Une solution appropriée dépend de la façon dont vous utilisez les informations de position et de vos exigences de vitesse. Si vous voulez que la base de données fasse l'ordre de position en récupérant les enregistrements (en utilisant la position "ORDER BY"), je ne peux pas penser à un moyen d'éviter la mise à jour des informations de position pour chaque ligne affectée. Vous pouvez réduire légèrement la surcharge en conservant les informations de position dans une table distincte dont les lignes contiennent uniquement la clé étrangère à votre table PK régulière plus la colonne "position". De cette façon, votre base de données n'a qu'à faire des mises à jour sur une table beaucoup plus petite.