Oracle SQL: как использовать CHECK Constraint, чтобы запретить перекрытие дат бронирования - PullRequest
0 голосов
/ 19 мая 2019

Я зависаю на проблеме

Представьте, что вы управляете отелем, у которого в базе данных есть база данных

CREATE TABLE Hotel
       (roomnr SMALLINT NOT NULL,
        arrival DATE NOT NULL,
        departure DATE NOT NULL,
        guest CHAR (30),
        PRIMARY KEY (roomnr, arrival)
        CHECK (departure >= arrival));

Таблица со следующим определением:

Так что вы не можете покинуть этот отель до вашего приезда.

Измените это определение, чтобы нельзя было вводить бронирование в таблицу, дата прибытия которой конфликтует с существующей датой вылета. Считать как столкновение

  • оба односторонних перекрытия, например 3.1.-6.1. уже забронированы и 1.1.- 5.1. или 4.1.-10.1. чем забронировать

  • , а также двусторонние перекрытия, например 2.1.-6.1. уже забронированы и 1.1.- 10.1. или 3.1.-5.1. чем зарезервировать.

1 Ответ

1 голос
/ 19 мая 2019

Oracle не поддерживает встроенный тип данных диапазона (насколько я знаю).Следовательно, он не имеет встроенной функции перекрытия.

Для реализации такой проверки у вас есть два варианта:

  • Создать пользовательскую функцию, которая проверяет перекрытия,Используйте эту функцию в проверочном ограничении.
  • Напишите триггер, который проверяет перекрытия.

(Второй может быть сложным в Oracle из-за ошибок в мутирующих таблицах.) Я думаю, что вам нужнонаписать функцию для использования в проверочном ограничении.

...