INSERT语句未插入任何行,game与gamePlayers表缺失数据插入失败
问题原因
你遇到的问题有两个最常见的诱因:
1. NOT IN 碰到NULL值导致筛选失效
这是SQL三值逻辑的经典坑:当NOT IN后面的子查询返回的结果集中存在任意NULL值时,整个NOT IN的判断结果会变为UNKNOWN,不会匹配到任何行,自然筛选不出要插入的90条数据。
如果你之前执行的查询语句确实能查出90条记录,大概率是两次执行之间有其他操作修改了gamePlayers表的数据,导致执行插入语句时,子查询返回的gameId结果集里出现了NULL值。
2. 插入语句未指定目标列
你写的INSERT语句没有显式指定插入的目标列,如果gamePlayers表的列创建顺序不是playerType在前、gameId在后,就会导致你SELECT出来的两个值和表的列顺序不匹配,要么触发字段约束(比如类型不匹配、外键校验失败、值范围校验失败)导致整个插入回滚,要么插入错误的值不符合预期。
修复方案
建议使用更稳定的NOT EXISTS写法替代NOT IN,同时显式指定插入的列名,避开上面两个坑:
INSERT INTO dbo.gamePlayers (playerType, gameId) SELECT 1, p.id FROM dbo.game p WHERE NOT EXISTS ( SELECT 1 FROM dbo.gamePlayers gp WHERE gp.gameId = p.id )
你也可以先单独执行上面语句里的SELECT部分,确认是否能返回你预期的90条记录,再执行插入操作。
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

