PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Génération de séquences dans l'ordre

Non. Puisqu'il n'y a pas d'ordre naturel de lignes dans une table de base de données, vous n'avez qu'à travailler avec les valeurs de votre table.

Eh bien, il y a les colonnes système spécifiques à Postgres cmin et ctid tu pourrais abus dans une certaine mesure.

L'ID de tuple (ctid ) contient le numéro de bloc de fichier et la position dans le bloc pour la ligne. Cela représente donc l'ordre physique actuel sur le disque. Les ajouts ultérieurs auront un ctid plus grand , normalement . Votre instruction SELECT pourrait ressembler à ceci

SELECT *, ctid   -- save ctid from last row in last_ctid
FROM   tbl
WHERE  ctid > last_ctid
ORDER  BY ctid

ctid a le type de données tid . Exemple :'(0,9)'::tid

Cependant, il n'est pas stable comme identifiant à long terme, puisque VACUUM ou toute UPDATE simultanée ou certaines autres opérations peuvent modifier l'emplacement physique d'un tuple à tout moment. Pendant la durée d'une transaction, il est stable, cependant. Et si vous insérez juste et rien sinon, cela devrait fonctionner localement pour votre objectif.

J'ajouterais une colonne d'horodatage avec la valeur par défaut now() en plus du serial colonne ...

Je laisserais également une colonne par défaut renseignez votre id colonne (un serial ou IDENTITY colonne). Cela récupère le numéro de la séquence à un stade ultérieur à la récupération explicite puis à son insertion, minimisant ainsi (mais n'éliminant pas) la fenêtre d'une condition de concurrence - la possibilité qu'un id inférieur serait inséré ultérieurement. Instructions détaillées :

  • Colonne de tableau d'incrémentation automatique