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 in Postgres:datetime
- Ignora del tutto i fusi orari in Rails e PostgreSQL
E devi solo memorizzare previous_address
(o maggiori dettagli), non , né address
. Entrambi sarebbero ridondanti in un modello di dati sano.original_address