Nie. Próbowano go wiele razy i jest to uciążliwe.
Użyj zwykłego serial
lub IDENTITY
kolumna:
- Automatyczna inkrementacja kolumny tabeli
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
);
Użyj funkcji okna row_number()
aby uzyskać numery seryjne bez przerw na person_id
. Możesz utrwalić VIEW
które możesz wykorzystać jako zamiennik dla swojej tabeli w zapytaniach, aby przygotować te liczby:
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;
Zobacz:
- Sekwencja bez luk, w której zaangażowanych jest wiele transakcji z wieloma tabelami
Lub możesz chcieć ORDER BY
coś innego. Może created_at
? Lepiej created_at, address_history_id
zerwać ewentualne więzi. Powiązana odpowiedź:
- Kolumna z alternatywnymi serialami
Ponadto typ danych, którego szukasz, to timestamp
lub timestamptz
, a nie w Postgresie:datetime
- Całkowite ignorowanie stref czasowych w Rails i PostgreSQL
Musisz tylko przechowywać previous_address
(lub więcej szczegółów), a nie ani address
. Oba byłyby zbędne w normalnym modelu danych.original_address