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 in Postgres:datetime
- Tijdzones volledig negeren in Rails en PostgreSQL
En u hoeft alleen previous_address
. op te slaan (of meer details), niet , noch address
. Beide zouden overbodig zijn in een gezond datamodel.original_address