PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Numeri di serie per gruppo di righe per chiave composta

Non. È stato provato molte volte ed è un dolore.

Usa un semplice serial o IDENTITY colonna:

  • Colonna tabella con incremento automatico
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
);

Usa la funzione della finestra row_number() per ottenere numeri di serie senza interruzioni per person_id . Puoi persistere un VIEW che puoi utilizzare come sostituto drop-in per la tua tabella nelle query per avere quei numeri pronti:

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;

Vedi:

  • Sequenza senza interruzioni in cui sono coinvolte più transazioni con più tabelle

Oppure potresti voler ORDER BY qualcos'altro. Forse created_at ? Meglio created_at, address_history_id per rompere eventuali legami. Risposta correlata:

  • Colonna con seriali alternativi

Inoltre, il tipo di dati che stai cercando è timestamp o timestamptz , non datetime in Postgres:

  • Ignora del tutto i fusi orari in Rails e PostgreSQL

E devi solo memorizzare previous_address (o maggiori dettagli), non address , né original_address . Entrambi sarebbero ridondanti in un modello di dati sano.