PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Generazione sequenza in ordine

No. Poiché non esiste nessun ordine naturale di righe in una tabella di database, tutto ciò con cui devi lavorare sono i valori nella tua tabella.

Bene, ci sono le colonne di sistema specifiche di Postgres cmin e ctid tu potresti abuso in una certa misura.

L'ID tupla (ctid ) contiene il numero del blocco di file e la posizione nel blocco per la riga. Quindi questo rappresenta l'ordine fisico corrente su disco. Le aggiunte successive avranno un ctid più grande , normalmente . La tua istruzione SELECT potrebbe assomigliare a questa

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

ctid ha il tipo di dati tid . Esempio:'(0,9)'::tid

Tuttavia non è stabile come identificatore a lungo termine, dal momento che VACUUM o qualsiasi UPDATE simultaneo o alcune altre operazioni possono modificare la posizione fisica di una tupla in qualsiasi momento. Tuttavia, per la durata di una transazione è stabile. E se stai solo inserendo e niente altrimenti, dovrebbe funzionare localmente per il tuo scopo.

Aggiungerei una colonna timestamp con now() predefinito oltre al serial colonna ...

Lascerei anche una colonna predefinita compila il tuo id colonna (un serial o IDENTITY colonna). Ciò recupera il numero dalla sequenza in una fase successiva rispetto al recupero e all'inserimento esplicito, riducendo così al minimo (ma non eliminando) la finestra per una condizione di gara:la possibilità che un id inferiore verrebbe inserito in un secondo momento. Istruzioni dettagliate:

  • Colonna tabella con incremento automatico