sql >> Database >  >> RDS >> PostgreSQL

Serienummers per groep rijen voor samengestelde sleutel

niet doen. Het is al vele malen geprobeerd en het is lastig.

Gebruik een gewone serial of IDENTITY kolom:

  • Tabelkolom automatisch verhogen
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
);

Gebruik de vensterfunctie row_number() om serienummers te krijgen zonder gaten per person_id . Je zou een VIEW . kunnen aanhouden die u kunt gebruiken als vervanging voor uw tabel in query's om die nummers bij de hand te hebben:

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;

Zie:

  • Opeenvolging zonder tussenruimte waarbij meerdere transacties met meerdere tabellen betrokken zijn

Of misschien wilt u ORDER BY iets anders. Misschien created_at ? Beter created_at, address_history_id mogelijke banden te verbreken. Gerelateerd antwoord:

  • Kolom met alternatieve series

Het gegevenstype dat u zoekt is ook timestamp of timestamptz , niet datetime in Postgres:

  • Tijdzones volledig negeren in Rails en PostgreSQL

En u hoeft alleen previous_address . op te slaan (of meer details), niet address , noch original_address . Beide zouden overbodig zijn in een gezond datamodel.




  1. Omgaan met MySQL-replicatieproblemen met ClusterControl

  2. Wat betekent <> in Oracle

  3. ORA-06508:PL/SQL:kon de aangeroepen programma-eenheid niet vinden

  4. SQL Server:SELECTEER alleen de rijen met MAX(DATE)