PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Números de série por grupo de linhas para chave composta


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 no Postgres:
  • Ignorando completamente os fusos horários no Rails e no PostgreSQL

E você só precisa armazenar previous_address (ou mais detalhes), não address , nem original_address . Ambos seriam redundantes em um modelo de dados sensato.