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