mysql - 将两列之间的时间差计算为表中的另一列 AFTER\BEFORE INSERT
问题描述
我有一个用于管理机场的数据库。我想尝试在表 FLIGHT_SCHEDULES 中的任何 INSERT 之后,将 ArrivingDate 和 DepartingDate 列(均为 DATETIME 类型)之间的时间差计算到名为 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;
为方便起见,您可以创建一个包含计算值的视图。
CREATE VIEW FLIGHT_SCHEDULES_WITH_FLIGHT_TIME
AS
SELECT *,
timediff(ArrivingDate, DepartingDate) Flight_time
FROM FLIGHT_SCHEDULES;
在 MySQL 8+ 中,您也可以使用生成的列。这是一种安全的方式,因为 DBMS 可以保证这样的一致性。
ALTER TABLE FLIGHT_SCHEDULES
ADD Flight_time time AS timediff(ArrivingDate, DepartingDate);
但是如果您坚持使用触发器,则不需要在伪记录UPDATE
中设置值。new
一个任务就够了。
...
SET NEW.Flight_time = TIMEDIFF(new.ArrivingDate, new.DepartingDate);
...
推荐阅读
- python - Matplotlib 中的对角线或弯曲错误
- dynamics-crm - 检查 Dynamics 365 CRM 中用户的剩余 API 调用限制
- angular - 我在我的 Angular 项目中找不到 e2e 文件夹
- python - 类型错误:列表索引必须是整数或切片,而不是 st
- node.js - 在 prisma create 上自动添加 UUID 关系
- c - 当用户输入新数据时,如何确保我的数据不会被覆盖?[C 结构和文件]
- flutter - 在颤动中单击相机按钮后手电筒重新启动
- reactjs - 当 id 未知时,CRA + react-intl 崩溃
- python - 如何获取手部图像中点的坐标?
- php - 如何定义 wp-cron?