我正在尝试创建一个新的触发器,一旦将新行插入到特定表中,它就会将数据插入到新表中。
我试着延长超时,检查语法,到目前为止还没有发现任何问题,但由于我是创建触发器的新手,我希望这是正确的方法,需要一些指导。
这就是我想要创建的触发器-
DROP TRIGGER IF EXISTS `dcs`.`cb_flights_AFTER_INSERT`;
DELIMITER $$
USE `dcs`$$
CREATE DEFINER = CURRENT_USER TRIGGER `dcs`.`cb_flights_AFTER_INSERT` AFTER INSERT ON `cb_flights` FOR EACH ROW
BEGIN
DECLARE round INT(11);
-- variable declarations
set @round = (select r.id
from dcs.rounds r
join dcs.maps m
on m.pk = r.map_fk
where NEW.map_fk = r.map_fk
and NEW.era_fk = r.era_fk
and
((NEW.takeoff_time > r.start_time and NEW.takeoff_time < r.end_time)
or
(NEW.takeoff_time > r.start_time and r.end_time is null)));
-- trigger code
insert into flights_rounds (flight_fk, round_fk)
values (NEW.flight_fk, round);
END$$
DELIMITER ;以下是相关的表格-
Table: cb_flights
Columns:
pk int(11) AI PK
ucid varchar(50)
takeoff_time datetime
end_time datetime
end_event varchar(45)
side varchar(45)
kills int(11)
type varchar(45)
map_fk int(11)
era_fk int(11)
Table: rounds
Columns:
id int(11) AI PK
round_id int(11)
map_fk int(11)
era_fk int(11)
start_time datetime
end_time datetime
winner varchar(45)
tour date
Table: maps
Columns:
pk int(11) AI PK
map varchar(45)
Table: eras
Columns:
pk int(11) AI PK
era varchar(45)
Table: flights_rounds
Columns:
flight_fk int(11) PK
round_fk int(11)我希望对于cb_flights表中插入的每个行,flights_rounds表中的触发器将创建一个新行,该行将指示cb_flights表中每个航班的圆角表中的相关轮次。
发布于 2019-07-15 19:53:10
您可以将触发器简化为:
begin
insert into flights_rounds (flight_fk, round_fk)
select NEW.flight_fk, r.id
from dcs.rounds r join
dcs.maps m
on m.pk = r.map_fk
where NEW.map_fk = r.map_fk and
NEW.era_fk = r.era_fk and
((NEW.takeoff_time > r.start_time and NEW.takeoff_time < r.end_time) or
(NEW.takeoff_time > r.start_time and r.end_time is null)
);
end;这也解决了round和@round之间的混淆。
这可能不会解决性能问题。为此,我建议在rounds(map_fk, era_fk, start_time, end_time)和maps(pk)上建立索引。
https://stackoverflow.com/questions/57039080
复制相似问题