昨天通过查询分析器批量删除垃圾用户的时候,结果把用户表给清空了,上百万条记录没了。
经过半小时的数据库还原,问题解决。用户数据都完全恢复。
但是那条语句为什么把用户表清空了我倒是很迷糊。
那条语句是这样的
1.
delete
Table_1
where
UserID
in
(
select
[ID]
from
Table_2)
问题是Table_2没有[ID]字段。结果Table_1的数据都清空了。
于是我做了下面的测试
1.
select
[ID]
from
Table_2
报错 列名 ‘ID’ 无效。
1.
select
top
10 *
from
Table_1
where
UserID
in
(
select
[ID]
from
Table_2)
列出了10条记录。
再测试,把[ID]修改为[xxxxx]
1.
select
top
10 *
from
Table_1
where
UserID
in
(
select
[xxxxx]
from
Table_2)
报错 列名 ‘xxxxx’ 无效。
看来是[ID]的问题,不明白这是为什么。
请大家帮忙理解一下这个问题,谢谢了。
当Table2里没有ID,用的就是Table1的ID,以后小心
刚才做了一下试验,
where UserID
in
(
select
[xxxxx]
from
Table_2)
[xxxxx]字段在table_1表里存在,但table_2表里不存在,语句没有错误,
但[xxxxx]在两个表里都不存在,语句提示错误。
也就是说[xxxxx]这个字段只要是在两个表里都存在,就是正确的。
create table t1
(
Id int identity(1,1),
name varchar(20)
)
create table t2
(
t2Id int identity(1,1),
nam varchar(20)
)
insert t1 select 'A'
insert t1 select 'B'
insert t1 select 'C'
insert t1 select 'D'
insert t1 select 'E'
insert t1 select 'F'
select * from t1 where name in (select name from t2)
create table table01
(
Id int identity(1,1),
name varchar(20)
)
create table table02
(
t2Id int identity(1,1),
nam varchar(20)
)
insert table01 select 'A'
insert table01 select 'B'
insert table01 select 'C'
insert table01 select 'D'
insert table01 select 'E'
insert table01 select 'F'
select * from table01 where name in (select name from table02)
(0 row(s) affected)
delete from table01 where name in (select name from table02)
(0 row(s) affected)
insert table01 select null
select * from table01 where name in (select name from table02)
(0 row(s) affected)
delete from table01 where name in (select name from table02)
(0 row(s) affected)
select * from table01 where Id in (select id from table02)
(0 row(s) affected)
delete from table01 where Id in (select id from table02)
(0 row(s) affected)
没出现你说的状况,sql2005 sp3/sql2008/sql2000 sp4下结论相同
是否你在删除的时候忘了where条件?或者当时只选中前面部分没选where??
估计设置个别名会安全一些。。。
同意Gray Zhang 的说法Table2里没有ID,用的就是Table1的ID,以后小心。
刚才在测试的时候发现,如果Table2表里面没有任何数据的时候,如邀月 发的那样,是没有找到任何数据的。
只要在Table2里面有一条数据,使用
Code
将会把所有table01表的数据检索出来。
长见识了····