Рассчитать разницу во времени между двумя столбцами в другой столбец ПОСЛЕ \ ПЕРЕД ВСТАВКОЙ в таблице - PullRequest
0 голосов
/ 10 июня 2019

У меня есть БД для управления аэропортом. Я хочу попытаться вычислить разницу во времени между столбцами ArrivingDate и DepartingDate (оба типа DATETIME) в третий столбец с именем Flight_time (тип TIME) после любого INSERT в таблице FLIGHT_SCHEDULES.

Я пытался создать триггер для этого, но безуспешно. Я уже прочитал кое-что в Интернете о своей ошибке, но не смог найти то, что решило бы мою дилемму.

This is the table:

CREATE TABLE FLIGHT_SCHEDULES(
    id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    Flight INT(10) UNSIGNED NOT NULL,
    Airplane INT(10) UNSIGNED NOT NULL,
    DepartingDate DATETIME NOT NULL,
    ArrivingDate DATETIME NOT NULL,
    Flight_time TIME DEFAULT '00:00:00',
    CONSTRAINT flight_unique UNIQUE (Flight),
    CONSTRAINT fk_scheduled_flight_id FOREIGN KEY (Flight) REFERENCES FLIGHTS(id) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_scheduled_airplane_id FOREIGN KEY (Airplane) REFERENCES AIRPLANES(id) ON UPDATE CASCADE ON DELETE CASCADE
);

This is the trigger I created:

delimiter //
CREATE TRIGGER calculate_flightTime2 BEFORE INSERT ON FLIGHT_SCHEDULES FOR EACH ROW
BEGIN
    UPDATE FLIGHT_SCHEDULES
    SET NEW.Flight_time = TIMEDIFF(new.ArrivingDate, new.DepartingDate);
END //

Я могу создать триггер без проблем, но при попытке вставить новую строку в таблицу я получаю следующее сообщение об ошибке:

Код ошибки: 1442. Невозможно обновить таблицу 'flight_schedules' в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер. 0,000 с

Обратите внимание, что я тоже пытался создать триггер AFTER, но результат был тот же.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Обычно не очень хорошая материализация значений, которые можно рассчитать из других. Это несет риск несоответствий. Что произойдет, если вы измените время прибытия, например?

Так что, вероятно, лучше оставить столбец Flight_time.

ALTER TABLE FLIGHT_SCHEDULES
            DROP Flight_time;

Для удобства вы можете создать представление, включающее в себя вычисленное значение.

CREATE VIEW FLIGHT_SCHEDULES_WITH_FLIGHT_TIME
AS
SELECT *,
       timediff(ArrivingDate, DepartingDate) Flight_time
       FROM FLIGHT_SCHEDULES;

В MySQL 8+ вы можете использовать сгенерированный столбец . Это безопасный способ, поскольку СУБД гарантирует такую ​​согласованность.

ALTER TABLE FLIGHT_SCHEDULES
            ADD Flight_time time AS timediff(ArrivingDate, DepartingDate);

Но если вы настаиваете на использовании триггера, вам не нужен UPDATE для установки значения в псевдозаписи new. Достаточно просто назначения.

...
SET NEW.Flight_time = TIMEDIFF(new.ArrivingDate, new.DepartingDate);
...
0 голосов
/ 10 июня 2019

Это ограничение mysql, поэтому вы не можете зацикливаться.

Попробуйте что-нибудь подобное.


CREATE TRIGGER calculate_flightTime2 
  BEFORE INSERT
  ON FLIGHT_SCHEDULES 
  FOR EACH ROW
BEGIN
  IF NEW.Flight_time = '00:00:00' THEN
    SET NEW.Flight_time = TIMEDIFF(new.ArrivingDate, new.DepartingDate);
  END IF;
END

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