Вы можете добавить ограничение в таблицу.
Alter Table Reservations Add Constraint unique_reservation Unique(Location,StartDate,EndDate);
Для этого вам понадобится триггер. Посмотрите на приведенный выше код:
CREATE TRIGGER no_overlap
BEFORE INSERT
ON Reservation FOR EACH ROW
BEGIN
SET @overlaps = ( SELECT count(*) FROM Reservation WHERE ( ( NEW.Start_Date >= Start_Date AND NEW.Start_Date <= End_Date AND NEW.Location = Location) || ( NEW.End_Date >= Start_Date AND NEW.End_Date <= End_Date AND NEW.Location = Location)));
IF @overlaps > 0 THEN
SIGNAL SQLSTATE '45000' SET
MYSQL_ERRNO = 31000,
MESSAGE_TEXT = 'Unable to insert an overlapping reservation';
END IF;
END;
INSERT INTO Reservation (Location,Start_Date,End_Date) VALUES(1,'2020-12-13','2020-12-16');
INSERT INTO Reservation (Location,Start_Date,End_Date) VALUES(1,'2020-12-14','2020-12-17');
Первая вставка будет выполнена успешно, а вторая не удастся с соответствующим сообщением об ошибке, если даты перекрываются:
SQL Error [31000] [45000]: (conn=10) Unable to insert an overlapping reservation
Кстати, я думаю, у вас есть ошибка в определении таблицы. Вместо CHECK (Start_Date> = End_Date), Я думаю, вы имели в виду CHECK (Start_Date <= End_Date), </strong>
Дайте мне знать, если это поможет.
Примечание: я сделал это на MariaDB, но вы можете применить то же самое для любой SQL БД.