PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Numéros de série par groupe de lignes pour la clé composée

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 datetime dans Postgres :

  • Ignorer complètement les fuseaux horaires dans Rails et PostgreSQL

Et vous n'avez qu'à stocker previous_address (ou plus de détails), pas address , ni original_address . Les deux seraient redondants dans un modèle de données sain.