PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Seriennummern pro Zeilengruppe für zusammengesetzten Schlüssel

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 datetime in Postgres:

  • Zeitzonen in Rails und PostgreSQL komplett ignorieren

Und Sie müssen nur previous_address speichern (oder weitere Details), nicht address , noch original_address . Beides wäre in einem vernünftigen Datenmodell redundant.