sql >> Databasteknik >  >> RDS >> PostgreSQL

Serienummer per grupp av rader för sammansatt nyckel

Gör det inte. Det har prövats många gånger och det är jobbigt.

Använd en vanlig serial eller IDENTITY kolumn:

  • Automatisk ökning av tabellkolumnen
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
);

Använd fönsterfunktionen row_number() för att få serienummer utan luckor per person_id . Du kan fortsätta med en VIEW som du kan använda som drop-in-ersättning för din tabell i frågor för att ha dessa nummer redo:

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:

  • Gapfri sekvens där flera transaktioner med flera tabeller är involverade

Eller så kanske du vill ORDER BY något annat. Kanske created_at ? Bättre created_at, address_history_id att bryta eventuella band. Relaterat svar:

  • Kolumn med alternativa serier

Dessutom är datatypen du letar efter timestamp eller timestamptz , inte datetime i Postgres:

  • Ignorerar tidszoner helt och hållet i Rails och PostgreSQL

Och du behöver bara lagra previous_address (eller mer information), inte address , inte heller original_address . Båda skulle vara överflödiga i en förnuftig datamodell.




  1. Hur man exporterar frågeresultat till en .txt-fil när du använder SQLcl (Oracle)

  2. Oracle SQL GROUP BY inte ett GROUP BY uttryck hjälp

  3. använd mysql SUM() i en WHERE-sats

  4. Hur man snabbar på att ladda data från oracle sql till pandas df