mysql - 计算表中插入之后\之前两列到另一列之间的时间差

标签 mysql database triggers

我有一个用于管理机场的数据库。我想尝试计算列 ArrivingDate 和 DepartingDate (均为 DATETIME 类型)之间的时间差到表 FLIGHT_SCHEDULES 中的任何 INSERT 之后的名为 Flight_time (TIME 类型)的第三列中。

我尝试创建一个触发器来执行此操作,但没有成功。我已经在互联网上阅读了一些有关我的错误的内容,但找不到可以解决我的困境的内容。

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 触发器,但结果是相同的。

最佳答案

通常,将可以从其他人计算出的值具体化并不是一个好主意。这存在不一致的风险。例如,如果您更改到达时间会发生什么?

因此,最好删除 Flight_time 列。

ALTER TABLE FLIGHT_SCHEDULES
            DROP Flight_time;

为了方便起见,您可以创建一个包含计算值的 View 。

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

在 MySQL 8+ 中,您也可以使用 generated column 。这是一种安全的方式,因为 DBMS 保证了这样的一致性。

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

但是,如果您坚持使用触发器,则不需要 UPDATE 来在 new 伪记录中设置值。只需一个任务就足够了。

...
SET NEW.Flight_time = TIMEDIFF(new.ArrivingDate, new.DepartingDate);
...

关于mysql - 计算表中插入之后\之前两列到另一列之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527818/

相关文章:

php - 选择查询中的日期比较返回错误结果

php - 如何对从数据库导入的多个数组使用循环

c# - 使用 Entity Framework 6 将数据从数据库存储到本地

php - 在数据库中搜索多段线坐标中的位置

mysql - 连接字符串不适用于 MySQL

sql - H2 数据库 - DATEDIFF 无法正常工作

c++ - Incomplete parameter error Including postgres.cpp working file in other .cpp 文件

mysql - 由于触发器导致 mysql 出现 1054 错误

c# - ControlTemplate.Triggers 中的 TemplatedParent 绑定(bind)

mysql - 如何使用sql触发器更新列