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