DELETE FROM dbo.FW_TASK_ACCEPT WHERE TASK_ID IN ( SELECT TASK_ID FROM dbo.FW_TASK );
上述是事故语句
按照字面的的语法本身没什么错误,编译也不会报错。导致删除表全部数据根源在于上下文,或者说作用域,这里我个人这个称呼便于理解
有一个基础的问题就是再子查询中 select 字段的时候是可以查询外层 “字段 ” 的,这就是主要的事故原因。我们看子查询中 TASK_ID 这里因为失误 写成了
SELECT TASK_ID FROM dbo.FW_TASK 其实 dbo.FW_TASK 表中并没有这个 TASK_ID 字段,但是因为作用域关系 SELECT TASK_ID 也是合法的,只不过是上层的 TASK_ID,那
这样就明了了,DELETE 删除时逐条删的,那么每一次 SELECT TASK_ID 都是自己的 TASK_ID,所以会删除 dbo.FW_TASK_ACCEPT 表中全部数据。
总结:
1.DELETE FROM ... WHERE 必须带 WHERE
2.语句操作必须带重命名,如:
DELETE FROM dbo.FW_TASK_ACCEPT WHERE TASK_ID IN ( SELECT fTask.ID FROM dbo.FW_TASK fTask);
3.理解掌握Sql语法