Lad være. Det er blevet prøvet mange gange, og det er en smerte.
Brug en almindelig serial eller IDENTITY kolonne:
- Automatisk stigning i tabelkolonnen
CREATE TABLE address_history (
address_history_id serial PRIMARY KEY
, person_id int NOT NULL REFERENCES people(id)
, created_at timestamp NOT NULL DEFAULT current_timestamp
, previous_address text
);
Brug vinduesfunktionen row_number() for at få serienumre uden huller pr. person_id . Du kan fortsætte med en VIEW som du kan bruge som drop-in-erstatning for din tabel i forespørgsler for at have disse tal klar:
CREATE VIEW address_history_nr AS
SELECT *, row_number() OVER (PARTITION BY person_id
ORDER BY address_history_id) AS adr_nr
FROM address_history;
Se:
- Gapløs sekvens, hvor flere transaktioner med flere tabeller er involveret
Eller du vil måske ORDER BY noget andet. Måske created_at ? Bedre created_at, address_history_id at bryde mulige bånd. Relateret svar:
- Kolonne med alternative serier
Den datatype, du leder efter, er også timestamp eller timestamptz , ikke i Postgres:datetime
- Ignorerer tidszoner helt i Rails og PostgreSQL
Og du behøver kun at gemme previous_address (eller flere detaljer), ikke , heller ikke address . Begge ville være overflødige i en fornuftig datamodel.original_address