Maison >base de données >tutoriel mysql >Pourquoi une requête Postgres SELECT renvoie-t-elle des lignes dans un ordre imprévu après une mise à jour de ligne ?

Pourquoi une requête Postgres SELECT renvoie-t-elle des lignes dans un ordre imprévu après une mise à jour de ligne ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 05:03:02730parcourir

Why Does a Postgres SELECT Query Return Rows in an Unforeseen Order After a Row Update?

Ordre imprévu des lignes dans les requêtes SELECT de Postgres après la mise à jour des lignes

Postgres est un système de gestion de base de données relationnelle largement utilisé, qui soulève souvent des questions concernant l' comportement par défaut de ses opérations. Dans ce scénario, la requête concerne l'ordre inattendu des lignes dans le résultat d'une requête SELECT suite à une opération de mise à jour sur une ligne.

Lors de l'exécution d'une requête SELECT sans spécifier explicitement de clause ORDER BY, Postgres récupère les lignes de la base de données dans un ordre arbitraire. Cet ordre dépend principalement des modèles physiques de stockage et de récupération de la base de données. Pour illustrer ce concept, considérons l'exemple suivant :

postgres=# select * from check_user;
 id | name
----+------
  1 | x
  2 | y
  3 | z
  4 | a
  5 | c1\
  6 | c2
  7 | c3
(7 rows)

Dans le tableau ci-dessus, les lignes sont initialement classées selon leurs valeurs d'identifiant. Cependant, après avoir mis à jour une ligne portant le même nom qu'une autre ligne :

postgres=# update check_user set name = 'c1' where name = 'c1\';
UPDATE 1
postgres=# select * from check_user;
 id | name
----+------
  1 | x
  2 | y
  3 | z
  4 | a
  6 | c2
  7 | c3
  5 | c1
(7 rows)

L'ordre des lignes a changé, la ligne mise à jour apparaissant désormais en bas du résultat. En effet, Postgres ne met généralement pas à jour les lignes en place, mais les marque comme supprimées et insère de nouvelles lignes.

Par conséquent, lorsque des requêtes SELECT ultérieures sont exécutées, Postgres récupère les lignes de la source disponible la plus rapide, ce qui peut ou non Ne correspond pas à la commande originale. Pour garantir un ordre prévisible, il est impératif de spécifier explicitement une clause ORDER BY dans les requêtes SELECT.

En résumé, Postgres ne maintient pas d'ordre par défaut prédéfini pour les lignes dans les jeux de résultats, sauf indication explicite via un ORDER BY. clause. Au lieu de cela, il récupère les lignes en fonction de modèles de stockage et de récupération internes, ce qui peut entraîner des résultats désordonnés après la mise à jour des lignes. Il est crucial de s'appuyer sur des mécanismes de classement explicites pour garantir un classement cohérent dans les requêtes SELECT.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn