ne. Bylo to mnohokrát vyzkoušeno a je to utrpení.
Použijte obyčejný serial
nebo IDENTITY
sloupec:
- Automaticky zvyšovat sloupec tabulky
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
);
Použijte funkci okna row_number()
získat sériová čísla bez mezer na person_id
. Můžete přetrvat VIEW
kterou můžete použít jako náhradu za vaši tabulku v dotazech, abyste měli tato čísla připravena:
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;
Viz:
- Posloupnost bez mezer, kde je zapojeno více transakcí s více tabulkami
Nebo můžete chtít ORDER BY
něco jiného. Možná created_at
? Lepší created_at, address_history_id
přerušit případné vazby. Související odpověď:
- Sloupec s alternativními seriály
Také typ dat, který hledáte, je timestamp
nebo timestamptz
, nikoli v Postgres:datetime
- Úplné ignorování časových pásem v Rails a PostgreSQL
A stačí uložit previous_address
(nebo více podrobností), nikoli ani address
. Obojí by bylo v rozumném datovém modelu nadbytečné.original_address