web-dev-qa-db-fra.com

Postgres conserve-t-il l'ordre d'insertion des enregistrements?

Par exemple, lorsque j'utilise une requête qui renvoie des ID d'enregistrement

INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;

Qui produisent une sortie:

1
2
3

Ces identifiants pointeront-ils vers les valeurs insérées correspondantes?

1 -> name1
2 -> name2
3 -> name3
20
Sergey

La réponse pour ce cas simple est Oui . Les lignes sont insérées dans l'ordre indiqué dans l'expression VALUES. Et si votre colonne id est de type serial, les valeurs de la séquence sous-jacente seront récupérées dans cet ordre.

Mais c'est un détail d'implémentation et il n'y a aucune garantie. En particulier, l'ordre n'est pas nécessairement conservé dans les requêtes plus complexes avec des conditions ou des jointures WHERE.

Vous pouvez également obtenir des lacunes ou d'autres lignes mélangées si vous avez des transactions simultanées écrivant dans la même table en même temps. Peu probable, mais possible.

Il n'y a pas d'ordre "naturel" dans une table de base de données. Alors que l'ordre physique des lignes (qui se reflète dans la colonne système ctid ) correspondra initialement à leur ordre inséré, cela peut changer à tout moment. UPDATE, DELETE, VACUUM et d'autres commandes peuvent modifier l'ordre physique des lignes. Mais les valeurs générées pour id sont stables et ne sont en aucun cas liées à cela, bien sûr.

19
Erwin Brandstetter

réponse d'Erwin Brandstetter peut ne pas être correct dans certains cas.

Nous avons fait un INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar et nous voyons que le SELECT ctid,* FROM foo montre que l'ordre physique des lignes dans le tableau ne correspond pas exactement à l'ordre d'insertion, il semble un peu brouillé. Notez que notre table a une colonne jsonb avec une taille de données très variable. La troncature expérimentale des données jsonb pendant l'insertion a rendu l'ordre d'insertion correct.

3
user2052675