首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在事件内使用IF-Clause

在事件内使用IF-Clause
EN

Stack Overflow用户
提问于 2020-04-02 06:04:58
回答 1查看 30关注 0票数 2

我正在使用MariaDB为一个基本的机场管理系统SQL数据库建模。我想创建一个事件"LastCall“,每次航班在30分钟内起飞时,它都会向表中添加一条消息。

到目前为止,我已经写好了代码:

代码语言:javascript
复制
CREATE TABLE LastCall(
TS  TIMESTAMP,
Message Varchar(100));

DELIMITER $
CREATE EVENT LastCallInsert
ON SCHEDULE EVERY 1 second
    DO
    BEGIN
        INSERT INTO LastCall(TS, Message)
        SELECT
            CURRENT_TIMESTAMP,
            CONCAT("Last call for passengers on flight ",FLIGHT.Flight_ID,". Go to gate ",FLIGHT.GateID)
        FROM FLIGHT
        WHERE TIMEDIFF(FLIGHT.Expected_Time,CURRENT_TIMESTAMP) = "00:30:00" AND FLIGHT.Depart_Arrives = "Departure";
    END; $
DELIMITER ;

这是桌上的飞行:

代码语言:javascript
复制
CREATE TABLE Flight(
Flight_ID       varchar(4) not null,
Depart_Arrives  enum('Departure','Arrival'),
AirportID       varchar(3),
AircraftREG     varchar(6) not null,
Expected_Time   datetime, 
GateID          varchar(3),
PRIMARY KEY(Flight_ID,Depart_Arrives),
FOREIGN KEY(AirportID) REFERENCES Airport(AirportID),
FOREIGN KEY(AircraftREG) REFERENCES Aircraft(AircraftREG),
FOREIGN KEY(GateID) REFERENCES Gate(GateID)
);

它给出了错误代码:

错误代码: 1054。“字段列表”中的未知列“Expected_Time”

你知道为什么它不能理解我对Expected_Time的引用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-02 06:09:10

实际上,您需要从FLIGHT表中执行SELECT操作,以查看航班是否满足条件--而您的IF语句没有做到这一点。

我认为您需要一条INSERT ... SELECT语句:

代码语言:javascript
复制
BEGIN
    INSERT INTO LastCall (ts, message)
    SELECT
        CURRENT_TIMESTAMP, 
        CONCAT("Last call for passengers on flight ", FlightID, ". Go to gate ", GateID) 
    FROM Flight
    WHERE 
        Expected_Time >= NOW() - INTERVAL 30 MINUTE
        AND Expected_Time < NOW() - INTERVAL 29 MINUTE;
END;

SELECT查询搜索expected_time距离现在正好30分钟的航班;您可能需要范围检查,而不是精确匹配(now()有秒)。如果找到行,则在目标表中插入相应的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60981065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档