Nicht. Es wurde viele Male versucht und es ist ein Schmerz.
Verwenden Sie eine einfache serial oder IDENTITY Spalte:
- Tabellenspalte automatisch erhöhen
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
);
Verwenden Sie die Fensterfunktion row_number() Seriennummern lückenlos pro person_id zu erhalten . Sie könnten eine VIEW beibehalten die Sie als Drop-in-Ersatz für Ihre Tabelle in Abfragen verwenden können, um diese Zahlen bereit zu haben:
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;
Siehe:
- Lückenlose Sequenz, bei der mehrere Transaktionen mit mehreren Tabellen beteiligt sind
Oder Sie möchten ORDER BY etwas anderes. Vielleicht created_at ? Besser created_at, address_history_id um mögliche Bindungen zu lösen. Zugehörige Antwort:
- Kolumne mit alternativen Seriennummern
Außerdem ist der gesuchte Datentyp timestamp oder timestamptz , nicht in Postgres:datetime
- Zeitzonen in Rails und PostgreSQL komplett ignorieren
Und Sie müssen nur previous_address speichern (oder weitere Details), nicht , noch address . Beides wäre in einem vernünftigen Datenmodell redundant.original_address