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 en PostgreSQL:datetime
- Ignorar las zonas horarias por completo en Rails y PostgreSQL
Y solo necesita almacenar previous_address (o más detalles), no , ni address . Ambos serían redundantes en un modelo de datos sensato.original_address