Использование IF-предложения внутри события - PullRequest
1 голос
/ 02 апреля 2020

Я моделирую базовую c систему управления аэропортом SQL базу данных, используя MariaDB. Я хочу создать событие «LastCall», которое добавляет сообщение в таблицу каждый раз, когда рейс отправляется ровно через 30 минут.

Пока я написал код:

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 ;

И это таблица Flight:

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?

1 Ответ

0 голосов
/ 02 апреля 2020

Вам нужно на самом деле SELECT из таблицы FLIGHT, чтобы увидеть, удовлетворяет ли рейс условиям, которых не выполняет ваше заявление IF.

Я думаю, что вам нужно INSERT ... SELECT оператор вместо:

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() есть секунды). Если строки найдены, соответствующая информация вставляется в целевую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...