PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Generowanie sekwencji w kolejności

Nie. Ponieważ nie ma nie ma naturalnego porządku wierszy w tabeli bazy danych, wszystko, z czym musisz pracować, to wartości w Twojej tabeli.

Cóż, istnieją kolumny systemowe specyficzne dla Postgresa cmin i ctid mogłeś nadużycia do pewnego stopnia.

Identyfikator krotki (ctid ) zawiera numer bloku pliku i pozycję w bloku dla wiersza. Reprezentuje to więc bieżące fizyczne uporządkowanie na dysku. Późniejsze dodatki będą miały większy ctid , normalnie . Twoja instrukcja SELECT może wyglądać tak

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

ctid ma typ danych tid . Przykład:'(0,9)'::tid

Jednak nie jest stabilny jako identyfikator długoterminowy, ponieważ VACUUM lub dowolna jednoczesna UPDATE lub niektóre inne operacje mogą w dowolnym momencie zmienić fizyczną lokalizację krotki. Na czas trwania transakcji jest jednak stabilna. A jeśli tylko wstawiasz i nic w przeciwnym razie powinno działać lokalnie w Twoim celu.

Dodałbym kolumnę sygnatury czasowej z domyślną now() oprócz serial kolumna ...

Pozwoliłbym również, aby kolumna była domyślna wypełnij swój id kolumna (serial lub IDENTITY kolumna). To pobiera numer z sekwencji na późniejszym etapie niż jawne pobranie, a następnie wstawienie go, minimalizując w ten sposób (ale nie eliminując) okno dla sytuacji wyścigu - prawdopodobieństwo, że niższy id zostanie wstawiony w późniejszym czasie. Szczegółowe instrukcje:

  • Automatyczna inkrementacja kolumny tabeli


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz tabelę dwóch typów w PostgreSQL

  2. Przestaw na wiele kolumn za pomocą funkcji Tablefunc

  3. Napraw „BŁĄD:brak wpisu klauzuli FROM dla tabeli” w PostgreSQL podczas korzystania z UNION, EXCEPT lub INTERSECT

  4. Replikacja strumieniowa PostgreSQL — szczegółowe informacje

  5. Jak zresetować sekwencję w postgresie i wypełnić kolumnę id nowymi danymi?