недей. Изпробвано е много пъти и е болка.
Използвайте обикновен serial
или IDENTITY
колона:
- Колона на таблицата с автоматично увеличение
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
);
Използвайте функцията на прозореца row_number()
за да получите серийни номера без пропуски за person_id
. Можете да запазите VIEW
които можете да използвате като добавка за заместване на вашата таблица в заявки, за да имате готови тези числа:
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;
Вижте:
- Последователност без пропуски, където участват множество транзакции с множество таблици
Или може да искате да ORDER BY
нещо друго. Може би created_at
? По-добре created_at, address_history_id
да скъса евентуални връзки. Свързан отговор:
- Колона с алтернативни сериали
Също така, типът данни, който търсите, е timestamp
или timestamptz
, а не в Postgres:datetime
- Изцяло игнориране на часовите зони в Rails и PostgreSQL
И трябва само да съхраните previous_address
(или повече подробности), а не , нито address
. И двете биха били излишни в разумен модел на данни.original_address