2008-12-15 7 views
5

J'ai une table nommée categories, qui contient les colonnes ID (long), Name (varchar (50)), parentID (long) et shownByDefault (boolean).PostgreSQL changeant l'ordre des lignes retournées

Cette table contient 554 enregistrements. Toutes les valeurs de type BoundDefault sont false.
Lorsque j'exécute 'select id, nom des catégories', pg me renvoie toutes les catégories, orderer par son identifiant.
Ensuite, je mets à jour certaines des lignes de la table ('update categories set shownByDefault où parentId = 1'), mise à jour OK.
Puis, quand j'essaie d'exécuter la première requête, qui renvoie toutes les catégories, ils sont retour avec un ordre très étrange.
Je n'ai pas de problème pour ajouter 'commander par', mais puisque j'utilise JPA pour obtenir ces valeurs, quelqu'un sait quel est le problème ou s'il y a un moyen de résoudre ce problème?

Répondre

16

Ce n'est pas un problème. L'ordre des lignes renvoyées par un SELECT SQL est indéfini à moins qu'il n'ait un ORDER BY. L'ordre dans lequel vous les obtenez est généralement influencé par l'ordre dans lequel ils sont stockés dans la table et/ou les indices utilisés par l'instruction.

Donc en fonction de cet ordre sans utiliser ORDER BY est une très, très mauvaise idée.

Si vous en avez besoin dans un certain ordre, spécifiez-le simplement.

Il est important qu'une table soit une set de lignes et non une sequence de lignes.

9

De l'docs:

Si la clause ORDER BY est spécifiée, les lignes retournées sont triées dans l'ordre spécifié. Si ORDER BY n'est pas indiqué, les lignes sont renvoyées dans l'ordre que le système trouve le plus rapide.

2

Les lignes sont renvoyées quel que soit leur ordre physique sur le disque; vous pouvez les réorganiser physiquement à l'aide de la commande SQL CLUSTER, mais en raison du fonctionnement de Postgres, ils ne seront plus ordonnés dès que vous commencerez à modifier des lignes.

Pour ce que vous faites un ORDER BY est la bonne réponse.