Não. Foi tentado muitas vezes e é uma dor.
Use um
serial
simples ou IDENTITY
coluna:- Coluna da tabela de incremento automático
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
);
Use a função de janela
row_number()
para obter números de série sem lacunas por person_id
. Você pode manter uma VIEW
que você pode usar como substituto imediato para sua tabela em consultas para ter esses números prontos: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;
Ver:
- Sequência sem lacunas em que várias transações com várias tabelas estão envolvidas
Ou você pode querer
ORDER BY
algo mais. Talvez created_at
? Melhor created_at, address_history_id
romper possíveis laços. Resposta relacionada:- Coluna com seriados alternativos
Além disso, o tipo de dados que você está procurando é
timestamp
ou timestamptz
, não datetime
- Ignorando completamente os fusos horários no Rails e no PostgreSQL
E você só precisa armazenar
previous_address
(ou mais detalhes), não address
original_address