子查询更新操作的坑

  

子查询我相信大部分人都写过,但是昨天遇到一个比较坑的问题,由于有较好的备份,很短时间就恢复了误操作数据,但是这个问题值得分享。
首先建立如下测试表:
CREATE TABLE <代码>课程 (
<代码> student_id INT (11),
<代码> 课程VARCHAR (20)
);
插入<代码>课程> 插入<代码>课程> 插入<代码>课程>   

CREATE TABLE <代码>学生 (
<代码> id> <代码>名称> );
插入<代码> 学生价值观(' 1 ',' jiate ');
插入<代码> 学生价值观(' 2 ',' haoshen ');
插入<代码> 学生价值观(' 3 ',' leishen ');
插入<代码> 学生价值观(' 4 ',' tetui ');

  

子查询更新操作的坑

  

现在我们执行如下查询操作:
中选择从学生id(从课程选择id)
子查询更新操作的坑”> <br/>这个结果很明显,多了一条。而在昨天,我们开发写的是个更新操作,也是就:更新学生设置name='特腿的id在(从课程选择id)本来更新1000条的数据,开发直接误更新了40多万条。<br/>仔细排查后,发现刚才两条sql发现过程中根本就不存在id列,那么刚才那两条sql为啥没有抛出身份证报错,而是直接全表匹配了? <br/>我们desc扩展看看优化器究竟干了什么?<br/> DESC扩展中选择</em>从学生id(从课程选择id) </p>
  <p> </p>显示警告
  <p> <img src=子查询更新操作的坑