Gör det inte. Det har prövats många gånger och det är jobbigt.
Använd en vanlig serial
eller IDENTITY
kolumn:
- Automatisk ökning av tabellkolumnen
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
);
Använd fönsterfunktionen row_number()
för att få serienummer utan luckor per person_id
. Du kan fortsätta med en VIEW
som du kan använda som drop-in-ersättning för din tabell i frågor för att ha dessa nummer redo:
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:
- Gapfri sekvens där flera transaktioner med flera tabeller är involverade
Eller så kanske du vill ORDER BY
något annat. Kanske created_at
? Bättre created_at, address_history_id
att bryta eventuella band. Relaterat svar:
- Kolumn med alternativa serier
Dessutom är datatypen du letar efter timestamp
eller timestamptz
, inte i Postgres:datetime
- Ignorerar tidszoner helt och hållet i Rails och PostgreSQL
Och du behöver bara lagra previous_address
(eller mer information), inte , inte heller address
. Båda skulle vara överflödiga i en förnuftig datamodell.original_address