已解决触发器以检查预留 mysql 的可用性
Posted
技术标签:
【中文标题】已解决触发器以检查预留 mysql 的可用性【英文标题】:SOLVED Trigger to check the availabilty of a reservation mysql 【发布时间】:2020-03-23 14:38:10 【问题描述】:我正在做一个学校项目,但我不知道如何在我的数据库中正确设置这种触发器。
我需要管理一个预订表。
可以在特定的开始时间预订某一天(日期)。
根据用户请求的服务,预订也将有一个结束时间,计算为每个请求服务的总和。
我想做的是创建一个触发器(或其他东西),如果该特定时间在该特定时间没有空位,则不允许用户插入预订。
例如,参考下表,我不想在 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
如果您能帮助我,我将不胜感激,即使采用不同的方法。非常感谢!
【问题讨论】:
触发器似乎根本不合适。首先运行选择查询以检查可用性,然后在无法进行预订时执行插入或显示错误消息。您在这里所做的是,删除一条原本不应该保存的记录。此外,处理异常比预测它们更昂贵。 非常感谢。所以我应该在每次插入该表之前运行一个选择查询,对吧? @Anonymous 我不明白的是如何链接选择和插入?我的意思是,在我编写了检查当时可用性的选择之后,我该怎么办?对不起,但我在开始。再次感谢您。 不查看您的 EXISTS 表达式 - 只需删除 DELETE 语句。 SIGNAL 就足够了(但将 SQLSTATE 更改为任何 CLASS '40')。 【参考方案1】:我已经设法用这个触发器解决了这个问题:
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 ;
【讨论】:
以上是关于已解决触发器以检查预留 mysql 的可用性的主要内容,如果未能解决你的问题,请参考以下文章
ping selenium hub以查看节点是否可用的方法?
MVC 3.0错误 HTTP 404您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。