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