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
相关产品推荐
相关产品推荐

