执行INSERT SQL语句耗时久且0行受影响,目标表未填充问题排查
解决INSERT执行成功但0行插入且耗时过长的问题
咱们来一步步拆解你遇到的问题——执行INSERT后目标表没数据,还耗时很久,这大概率是关联逻辑出了问题,甚至有隐式笛卡尔积拖慢查询,同时过滤掉了所有有效数据。结合你的表结构和SQL语句,我整理了几个核心问题和修复步骤:
1. 致命的JOIN语法错误:缺失ON条件
你的SQL里INNER JOIN Divinite后面完全没有写关联条件,这会导致Divinite表和前面的关联结果做笛卡尔积——也就是把Divinite的每一行和前面的每一行都配对,这会瞬间生成海量数据,直接拖慢查询速度。更糟的是,后续的关联条件可能根本无法从这个混乱的笛卡尔积里筛选出有效匹配,最终返回0行。
2. 字段拼写与关联逻辑错误
仔细看你的SQL,还有好几处明显的拼写或关联错误:
escales.divinite = nom.divinite:你的表结构里根本没有nom表,应该是Divinite.Name吧?毕竟Divinite表有Name字段,推测你是想关联escales里的神名和Divinite的名称。CONCAT(heros.prenom,heros.nom):你的Heros表结构是(ID,Name,Lastname),根本没有prenom和nom字段,应该是CONCAT(heros.Name, heros.Lastname)(或者反过来,取决于equipage里存的格式)。如果拼接的字段不对,自然匹配不到equipage里的英雄数据。equipage.bateau = Navire.nom:Navire表的字段是Name不是nom,拼写错误会导致关联失败。
3. 排查与修复步骤
第一步:单独测试SELECT语句
先把INSERT去掉,只运行SELECT部分,看看返回多少行数据。如果SELECT本身就返回0行,那INSERT肯定也不会有数据。
第二步:逐步简化JOIN,定位问题点
从最简单的关联开始,比如先只查numr和equipage:
SELECT numr.ID, equipage.expédition FROM numr INNER JOIN equipage ON equipage.expédition = numr.NR
如果这部分有数据,再逐步添加其他表(先加escales,再加Divinite,以此类推),每加一个表就运行一次,看在哪一步数据变成0,那就是这一步的关联条件出了问题。
第三步:修正后的SQL示例
结合你的表结构,我调整了所有明显的错误,你可以根据实际数据格式再微调:
INSERT INTO expedition (Numero, ID_divinite, ID_navire, ID_heros) SELECT numr.ID, divinite.ID, navire.ID, heros.ID FROM numr INNER JOIN equipage ON equipage.expédition = numr.NR INNER JOIN escales ON escales.expédition = equipage.expédition INNER JOIN Divinite ON escales.divinite = Divinite.Name -- 补上Divinite的关联条件 INNER JOIN navire ON equipage.bateau = Navire.Name -- 修正Navire字段名 INNER JOIN heros ON equipage.héros = CONCAT(heros.Name, ' ', heros.Lastname) -- 修正Heros字段,按需添加空格
额外提示
- 检查数据类型匹配:比如
equipage.expédition和numr.NR的数据类型是否一致?如果一个是字符串一个是数字,隐式转换可能导致匹配失败。 - 检查字符串格式:比如equipage里的英雄名是"JohnDoe"还是"John Doe",拼接的时候要对应上,否则CONCAT的结果和equipage的内容不匹配。
内容的提问来源于stack exchange,提问作者Danny boon
相关产品推荐
相关产品推荐

