mauricio pullabuestan escribió: > CREATE TABLE permiso > ( > numero_permiso integer NOT NULL, > director_id character varying(5), > dependiente_id character varying(5), > jornada_id character varying(2), > permiso_periodo tstzrange, > observaciones character varying(100), > activo boolean, > CONSTRAINT pk_permisos PRIMARY KEY ( numero_permiso) > ); > > > Necesito evitar que se solapen los permisos de dependiente_id, > permiso_periodo. > > > Al ser 2 campos de distintos tipos no se si se puede y como hacer un exclude > o un indice unico con estos 2 campos, de poder cual seria la mejor opción, si > no se puede como podría evita overlaps
Hola, esto en Postgres se llama "restricción de exclusión" (exclusion constraint en inglés); necesitas un índice gist con soporte para los tipos en cuestión. Algo así create extension btree_gist; -- esto es para el operador = en varchar CREATE TABLE permiso ( numero_permiso integer NOT NULL, director_id character varying(5), dependiente_id character varying(5), jornada_id character varying(2), permiso_periodo tstzrange, observaciones character varying(100), activo boolean, CONSTRAINT pk_permisos PRIMARY KEY ( numero_permiso), constraint no_traslape exclude using gist (dependiente_id with =, permiso_periodo with &&)); -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services