You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

INSERT语句意外插入4行而非1行的问题求助

问题描述

这是个简单明了的错误,但我找不到解决办法。我用了下面这条SQL语句:

INSERT INTO Movimiento (ExpedienteId,FechaIngreso,SectorOrigen,SectorDestino,FechaEnvio) 
SELECT 25,'2022-11-15 00:00:00.000',2,3,'2022-11-19 00:00:00.000' 
FROM Expediente e left JOIN Movimiento m ON e.ExpedienteId = m.ExpedienteId 
WHERE m.ExpedienteId IS NULL

这条语句本该往Movimiento表插入1行数据,结果实际插入了4条完全相同的记录。执行查询语句:

select * from Movimiento where ExpedienteId = 25

得到的结果是:

MovimientoId    ExpedienteId    FechaIngreso    SectorOrigen    SectorDestino   FechaEnvio   
1271            25              2022-11-15 00:00:00.000 2       3               2022-11-19 00:00:00.000    
1272            25              2022-11-15 00:00:00.000 2       3               2022-11-19 00:00:00.000  
1273            25              2022-11-15 00:00:00.000 2       3               2022-11-19 00:00:00.000  
1274            25              2022-11-15 00:00:00.000 2       3               2022-11-19 00:00:00.000
解决方案

问题根源是Expediente表中存在4条ExpedienteId=25且未关联Movimiento记录的行,导致SELECT语句返回4行相同的固定值,最终插入4条重复数据。

你可以通过以下几种方式解决:

  • 限制查询返回行数
    在SELECT后添加TOP 1(SQL Server)或LIMIT 1(MySQL/PostgreSQL),确保只返回1行:

    INSERT INTO Movimiento (ExpedienteId,FechaIngreso,SectorOrigen,SectorDestino,FechaEnvio) 
    SELECT TOP 1 25,'2022-11-15 00:00:00.000',2,3,'2022-11-19 00:00:00.000' 
    FROM Expediente e LEFT JOIN Movimiento m ON e.ExpedienteId = m.ExpedienteId 
    WHERE m.ExpedienteId IS NULL
    
  • 用EXISTS判断替代JOIN
    直接检查是否存在符合条件的Expediente记录,避免因多行匹配导致重复插入:

    INSERT INTO Movimiento (ExpedienteId,FechaIngreso,SectorOrigen,SectorDestino,FechaEnvio) 
    SELECT 25,'2022-11-15 00:00:00.000',2,3,'2022-11-19 00:00:00.000' 
    WHERE EXISTS (
        SELECT 1 FROM Expediente e 
        WHERE e.ExpedienteId=25 
        AND NOT EXISTS (SELECT 1 FROM Movimiento m WHERE m.ExpedienteId=e.ExpedienteId)
    )
    
  • 直接判断是否已存在记录
    如果只是要给ExpedienteId=25插入一条记录,用条件判断确保只执行一次插入:

    IF NOT EXISTS (SELECT 1 FROM Movimiento WHERE ExpedienteId=25)
    BEGIN
        INSERT INTO Movimiento (ExpedienteId,FechaIngreso,SectorOrigen,SectorDestino,FechaEnvio) 
        VALUES (25,'2022-11-15 00:00:00.000',2,3,'2022-11-19 00:00:00.000')
    END
    

内容的提问来源于stack exchange,提问作者luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:25:39