PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Generierung von In-Order-Sequenzen

Nein. Da es keine natürliche Ordnung gibt von Zeilen in einer Datenbanktabelle müssen Sie nur mit den Werten in Ihrer Tabelle arbeiten.

Nun, es gibt die Postgres-spezifischen Systemspalten cmin und ctid Sie könnten bis zu einem gewissen Grad missbrauchen.

Die Tupel-ID (ctid ) enthält die Dateiblocknummer und die Position im Block für die Zeile. Dies stellt also die aktuelle physische Reihenfolge auf der Festplatte dar. Spätere Ergänzungen haben eine größere ctid , normalerweise . Ihre SELECT-Anweisung könnte so aussehen

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

ctid hat den Datentyp tid . Beispiel:'(0,9)'::tid

Allerdings ist es nicht stabil als Langzeitkennung, seit VACUUM oder jedes gleichzeitige UPDATE oder einige andere Operationen können die physische Position eines Tupels jederzeit ändern. Für die Dauer einer Transaktion ist es jedoch stabil. Und wenn Sie nur und nichts einfügen andernfalls sollte es für Ihren Zweck lokal funktionieren.

Ich würde eine Timestamp-Spalte mit dem Standardwert now() hinzufügen zusätzlich zur serial Spalte ...

Ich würde auch eine Spalte voreinstellen lassen geben Sie Ihre id ein Spalte (eine serial oder IDENTITY Säule). Dadurch wird die Nummer aus der Sequenz zu einem späteren Zeitpunkt abgerufen als durch explizites Abrufen und anschließendes Einfügen, wodurch das Fenster für eine Race-Condition minimiert (aber nicht eliminiert) wird - die Chance, dass eine niedrigere id würde zu einem späteren Zeitpunkt eingefügt werden. Detaillierte Anleitung:

  • Tabellenspalte automatisch erhöhen