Como crear una clave unica con un rango de fechas en postgresql

Crear un indice único con un rango de fechas para que no exista un registro en el mismo rango de fecha y hora en postgresql...
Publicado
Actualizado
Engagements 0 Comentario

Crear un indice único con un rango de fechas para que no exista un registro en el mismo rango de fecha y hora en postgresql es muy sencillo, lo explicaremos un ejemplo:

Imaginemos que tenemos un calendario de citas medicos con la estructura:

id_medico Int
fecha_inicial timestamp
fecha_final timestamp

Lo que queremos lograr es que no se permita para él mismo id_medico un registro que este sobrepuesto sobre otro usando el rango de fecha. Es decir:

suponiendo que ya tenemos un registro para el ID = 1 con la fecha inicial =  2021-04-22 08:00:00 y fecha final = 2021-04-22 10:00:00 y queremos insertar un nuevo registro para el mismo ID medico con fecha inicial =  2021-04-22 07:00:00 y fecha final =2021-04-22 09:00:00 no debería permitir el INSERT, para lograr esto solo debemos crear un indice único usando  EXCLUDE y tsrange de postgresql con la siguiente sentencia: 

ALTER TABLE [NOMBRE_TABLA] ADD CONSTRAINT [NOMBRE_INDICE]
        EXCLUDE USING GIST (id_medico WITH =, tsrange(fecha_inicial, fecha_final) WITH &&)

Debes tener la extensión btree_gist instalada, si no la tienes puedes instalarla con el siguiente código:

CREATE EXTENSION IF NOT EXISTS btree_gist;

Ver ejemplo https://dbfiddle.uk/?rdbms=postgres_14&fiddle=74473ca3908e1e6aa77ba2e9f9c85cac

Comentarios