sql >> Database teknologi >  >> RDS >> PostgreSQL

Serienumre pr. gruppe af rækker for sammensat nøgle

Lad være. Det er blevet prøvet mange gange, og det er en smerte.

Brug en almindelig serial eller IDENTITY kolonne:

  • Automatisk stigning i tabelkolonnen
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
);

Brug vinduesfunktionen row_number() for at få serienumre uden huller pr. person_id . Du kan fortsætte med en VIEW som du kan bruge som drop-in-erstatning for din tabel i forespørgsler for at have disse tal klar:

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;

Se:

  • Gapløs sekvens, hvor flere transaktioner med flere tabeller er involveret

Eller du vil måske ORDER BY noget andet. Måske created_at ? Bedre created_at, address_history_id at bryde mulige bånd. Relateret svar:

  • Kolonne med alternative serier

Den datatype, du leder efter, er også timestamp eller timestamptz , ikke datetime i Postgres:

  • Ignorerer tidszoner helt i Rails og PostgreSQL

Og du behøver kun at gemme previous_address (eller flere detaljer), ikke address , heller ikke original_address . Begge ville være overflødige i en fornuftig datamodel.




  1. LENGTH() Funktion i Oracle

  2. Det serialiserbare isolationsniveau

  3. Til forsvar for sar (og hvordan man konfigurerer det)

  4. mysql root adgangskode glemt