РЕШЕНО Триггер, чтобы проверить наличие бронирования mysql - PullRequest
0 голосов
/ 23 марта 2020

Я работаю над школьным проектом и не могу понять, как правильно установить этот тип триггера в моей базе данных.

Мне нужно управлять таблицей резервирование .

Можно сделать заказ на определенный день (Дата) в указанное c время начала.

На основании запрошенных пользователем услуг, резервирование будет также иметь время окончания, которое рассчитывается как сумма каждой запрошенной услуги.

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

Например, приведение ссылки на таблицу ниже Я не хочу разрешать вставку резервирования между 10:30 и 11:00 08/22/19.

Это пример таблицы:

| id |Customer|    Date    | startTime     | endTime  |
|----|--------|------------|---------------|----------|
| 1  |    1   | 08/22/19   |  10:30:00     | 11:00:00 |
| 2  |    2   | 08/22/19   |  12:30:00     | 13:30:00 |
| 3  |    3   | 09/22/19   |  10:30:00     | 10:45:00 |

Это запрос, который я написал для вставки в таблицу:

INSERT INTO reservation(Customer, Date, startTime, endTime) VALUES 
((SELECT id from customer WHERE id='1' ), '08/22/19', '103000', '103000'); #endTime is initialized as startTime

Это триггер, который я пытался запустить:

DROP TRIGGER IF EXISTS CheckHour;
DELIMITER $$
CREATE  TRIGGER CheckHour AFTER INSERT ON reservation
FOR EACH ROW
BEGIN
    IF 
        EXISTS(  SELECT *
                 FROM reservation
                 GROUP BY new.Date, new.startTime
                 HAVING COUNT(new.Date) > 1 AND COUNT(new.startTime) > 1)
    THEN
        DELETE FROM reservation WHERE id = new.id;
        SIGNAL sqlstate '20000' SET MESSAGE_TEXT = 'DUPLICATED RESERVATION';
    END IF; 
END;
$$
DELIMITER ;

Что происходит, как только когда я вставляю в резервацию, я получаю эту ошибку:

Error Code: 1442. Can't update table 'reservation' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.   0.000 sec

Я был бы очень признателен, если бы вы могли мне помочь, даже с другим подходом. Большое спасибо!

1 Ответ

0 голосов
/ 23 марта 2020

Мне удалось решить эту проблему с помощью этого триггера:

DROP TRIGGER IF EXISTS CheckHour;
DELIMITER $$
CREATE  TRIGGER CheckHour BEFORE INSERT ON prenotazione
FOR EACH ROW
BEGIN
    IF 
        EXISTS(  SELECT *
                 FROM prenotazione
                 WHERE new.Data = prenotazione.Data AND
                       new.OraInizio > prenotazione.OraInizio AND
                       new.OraInizio < prenotazione.OraFine)
    THEN
        SIGNAL sqlstate '20000' SET MESSAGE_TEXT = 'DUPLICATED RESERVATION';
    END IF; 
END;
$$
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...