首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建mysql触发器时读取超时不会出现错误

创建mysql触发器时读取超时不会出现错误
EN

Stack Overflow用户
提问于 2019-07-15 19:46:34
回答 1查看 272关注 0票数 0

我正在尝试创建一个新的触发器,一旦将新行插入到特定表中,它就会将数据插入到新表中。

我试着延长超时,检查语法,到目前为止还没有发现任何问题,但由于我是创建触发器的新手,我希望这是正确的方法,需要一些指导。

这就是我想要创建的触发器-

代码语言:javascript
复制
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 ;

以下是相关的表格-

代码语言:javascript
复制
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表中每个航班的圆角表中的相关轮次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-15 19:53:10

您可以将触发器简化为:

代码语言:javascript
复制
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)上建立索引。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57039080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档