我正在做一个学校项目,我不知道如何在数据库中正确设置这种触发器。
我需要管理预订表格。
可以在特定的开始时间预订某一天(日期(。
基于用户请求的服务,预订还将具有结束时间,该结束时间被计算为每个请求的服务的总和。
我想做的是创建一个触发器(或其他东西(,如果在特定时间没有特定日期的可用性,它将不允许用户插入预订。
例如,参考下表,我不想在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 ;