sql >> Base de Datos >  >> RDS >> PostgreSQL

Números de serie por grupo de filas para clave compuesta

No. Se ha intentado muchas veces y es un fastidio.

Usa un serial simple o IDENTITY columna:

  • Columna de tabla 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
);

Utilice la función de ventana row_number() para obtener números de serie sin espacios por person_id . Podría persistir un VIEW que puede usar como reemplazo directo de su tabla en las consultas para tener esos números listos:

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:

  • Secuencia sin espacios donde están involucradas múltiples transacciones con múltiples tablas

O tal vez quieras ORDER BY algo más. Quizás created_at ? Mejor created_at, address_history_id para romper posibles lazos. Respuesta relacionada:

  • Columna con publicaciones seriadas alternativas

Además, el tipo de datos que está buscando es timestamp o timestamptz , no datetime en PostgreSQL:

  • Ignorar las zonas horarias por completo en Rails y PostgreSQL

Y solo necesita almacenar previous_address (o más detalles), no address , ni original_address . Ambos serían redundantes en un modelo de datos sensato.