已解决触发器以检查预留 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 的可用性的主要内容,如果未能解决你的问题,请参考以下文章

查找预订重叠以检查日期可用性

WSFC 主机资源预留

ping selenium hub以查看节点是否可用的方法?

MVC 3.0错误 HTTP 404您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。

适用于 Elastic Beanstalk 的 AWS 预留实例和可用区

目标c检查蓝牙可用性是不是已更改[重复]