Ne le faites pas. Cela a été essayé plusieurs fois et c'est pénible.
Utilisez un serial simple ou IDENTITY colonne :
- Colonne de tableau d'incrémentation automatique
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
);
Utilisez la fonction de fenêtre row_number() pour obtenir des numéros de série sans lacunes par person_id . Vous pouvez conserver un VIEW que vous pouvez utiliser en remplacement de votre table dans les requêtes pour que ces chiffres soient prêts :
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;
Voir :
- Séquence sans interruption où plusieurs transactions avec plusieurs tables sont impliquées
Ou vous voudrez peut-être ORDER BY autre chose. Peut-être created_at ? Mieux created_at, address_history_id pour rompre d'éventuels liens. Réponse connexe :
- Colonne avec des publications en série alternatives
De plus, le type de données que vous recherchez est timestamp ou timestamptz , pas dans Postgres :datetime
- Ignorer complètement les fuseaux horaires dans Rails et PostgreSQL
Et vous n'avez qu'à stocker previous_address (ou plus de détails), pas , ni address . Les deux seraient redondants dans un modèle de données sain.original_address