SOLVED触发器,用于检查保留mysql的可用性



我正在做一个学校项目,我不知道如何在数据库中正确设置这种触发器。

我需要管理预订表格。

可以在特定的开始时间预订某一天(日期(。

基于用户请求的服务,预订还将具有结束时间,该结束时间被计算为每个请求的服务的总和。

我想做的是创建一个触发器(或其他东西(,如果在特定时间没有特定日期的可用性,它将不允许用户插入预订。

例如,参考下表,我不想在2019年8月22日10:30至11:00之间插入预订。

这是表格的一个例子:

| 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

如果你能帮助我,我真的很感激,即使是用不同的方法。非常感谢!

我已经用这个触发器解决了这个问题:

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 ;

最新更新