update select same where子句更新记录子集

时间:2014-12-17 15:44:46

标签: mysql sql select sql-update where-in

我有一个查询,当我将其作为选择运行时,我得到1014条记录。当我将其作为更新运行时,它会更新通常少于5的不同数量的记录。

实施例

Select * from Table 
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'

返回1014行

update Table
set meaninglesscolumn = 1
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'

此更新运行后,此查询返回1012(或更低的数字,每次运行后它会一直下降,但运行此+500次将是麻烦)

Select * from Table 
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'
and meaninglesscolumn <> 1

感谢。

更新

对于这种混淆感到抱歉,上面的'select'返回了1658条记录,而不是1014条记录。我用'和无意义的列&lt;&gt;来运行它1'并得到1015(我想要更新的记录数)。然后我运行上面的'更新'和'选择'然后得到1014,然后再次运行'更新'并得到1012。

如此全程......

Select * from Table 
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'

返回1658

Select * from Table 
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'
and meaninglesscolumn <> 1

返回1015

update Table
set meaninglesscolumn = 1
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'

返回1行更新。

Select * from Table 
where firstname ='john' 
and lastname = 'smith' 
and email='john.smith@gmail.com'
and meaninglesscolumn <> 1

返回1014

4 个答案:

答案 0 :(得分:0)

select查询返回所有记录。 在无意义的列中找到更新查询更新或仅设置不同的值。 在第一种情况下,2记录在无意义列中已经具有值1。所以它只更新了1012条记录。

答案 1 :(得分:0)

尝试

update Table
set meaninglesscolumn = 1
where id in (
    Select id from Table 
    where firstname ='john' 
    and lastname = 'smith' 
    and email='john.smith@gmail.com'
    and meaninglesscolumn <> 1)
;

答案 2 :(得分:0)

如上所述,SELECT语句只是匹配FirstName,LastName和Email ......没有别的!因此忽略所有其他列,包括MeaninglessColumn。

如果你有1000行,其中100个具有MeaninglessColumn = 1和900作为MeaninglessColumn = 2,仅在你的WHERE子句中使用FirstName,LastName和Email,它不关心有多少具有MeanlessColumn = 1或2。现在,在您的UPDATE语句中,您正在更新与SELECT相同的行数(即使其中一些已经具有MeaninglessColumn = 1),因此您的更新将返回与初始SELECT相同的行数(至少在MS中) SQL Server)。但是,您正在第二次尝试更改SELECT,现在添加在MeaninglessColumn&lt;&gt;中你做了两件事:

  • 首先,您已从UPDATE更改了数据集,以便与初始SELECT匹配的所有行都具有MeaninglessColumn = 1
  • 您已将SELECT更改为现在甚至可以在MeanlessColumn&lt;&gt;上进一步过滤1,其中现在不存在

正如priyanka-kotari所述,如果您想查看您将要影响的确切行数,您需要包含您正在更新的内容的否定,即MeaninglessColumn&lt;&gt; 1。

答案 3 :(得分:0)

为什么不用while循环来更新它们呢?

选择

while(result = fetch){     UPDATE }