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