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
Réponses:
La réponse pour ce cas simple est oui . Les lignes sont insérées dans l'ordre fourni dans l'
VALUES
expression. Et si votreid
colonne est unserial
type, 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 maintenu dans des requêtes plus complexes avec des
WHERE
conditions ou des jointures.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 pourid
sont stables et ne sont en aucun cas liées à cela, bien sûr.la source
serial
colonne fraîchement créée - idéalement dans la même transaction.WHERE
conditions. Bien que je ne puisse pas penser à desWHERE
conditions simples qui changeraient l'ordre des lignes, les jointures peuvent certainement le faire.La réponse d'Erwin Brandstetter peut ne pas être correcte dans certains cas.
Nous avons fait un
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
et nous voyons que celaSELECT 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.la source