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