Я пытаюсь создать простую базу данных регистрации гостиничного номера в качестве учебного упражнения.Альтернатива использованию подзапроса внутри ограничения CHECK?
CREATE TABLE HotelReservations
(
roomNum INTEGER NOT NULL,
arrival DATE NOT NULL,
departure DATE NOT NULL,
guestName CHAR(30) NOT NULL,
CONSTRAINT timeTraveler CHECK (arrival < departure) /* stops time travelers*/
/* CONSTRAINT multipleReservations CHECK (my question is about this) */
PRIMARY KEY (roomNum, arrival)
);
У меня возникли проблемы с указанием ограничения, которое не позволяет вставить новый номер комнаты, которая еще не освобожденной. Например (ниже), гость «B» проверяет в комнате 123 до «A».
INSERT INTO HotelStays(roomNum, arrival, departure, guestName)
VALUES
(123, date("2017-02-02"), date("2017-02-06"), 'A'),
(123, date("2017-02-04"), date("2017-02-08"), 'B');
Этого нельзя допускать, но я не уверен, как написать это ограничение. Моя первая попытка состояла в том, чтобы проверить подзапрос, но у меня возникли проблемы с поиском правильного подзапроса, потому что я не знаю, как получить доступ к значению «roomNum» новой вставки для выполнения подзапроса. Затем я также понял, что большинство систем SQL даже не разрешают подзапросы внутри проверки.
Так как же я должен написать это ограничение? Я читал некоторые о триггерах, которые, похоже, могут решить эту проблему, но действительно ли это единственный способ сделать это? Или я просто плотный и отсутствует очевидный способ написать ограничение?
Вы задаете несколько вопросов, и они все дубликаты. Пожалуйста, сначала имейте это в виду, с и без stackoverflow, с и без SQLite. Например, какие SQL-базы данных поддерживают подзапросы в CHECK, Sub-запросы в контрольном ограничении, создание условного SQL-триггера в SQLite, перекрытие контрольного ограничения диапазона дат. Вам нужны триггеры. Повторите свой конкретный запрос ограничения, чтобы увидеть мой ответ re [Найти диапазон дат в одной таблице] (http://stackoverflow.com/a/34327197/3404097). – philipxy
Вы не можете делать то, что хотите, с контрольным ограничением - если вы не используете определенную пользователем функцию. Но если вы собираетесь это сделать, вы можете использовать триггер или хранимую процедуру в любом случае. –