Mysql 不带where子句的更新

Mysql 不带where子句的更新,mysql,sql,Mysql,Sql,我想把第二排改成第二排。 我可以使用的查询是 +------+------+ | id | no | +------+------+ | 1 | 1 | | 11 | 1 | | 21 | 1 | +------+------+ 如果没有where子句,我如何实现相同的目标 我不确定为什么你会想,但是 update test set no = 2 where id = 11; 作为记录,如果这没有表现得很糟糕,我会感到惊讶,因为它会遍历表中的每一行。这

我想把第二排改成第二排。 我可以使用的查询是

+------+------+
| id   | no   |
+------+------+
|    1 |    1 |
|   11 |    1 |
|   21 |    1 |
+------+------+

如果没有where子句,我如何实现相同的目标

我不确定为什么你会想,但是

update test set no = 2 where id = 11;

作为记录,如果这没有表现得很糟糕,我会感到惊讶,因为它会遍历表中的每一行。

这是不可能的,没有where的更新就是对所有表的更新。您可以试试这个,但它总是像一个:

UPDATE `test` SET `no` = IF(`id`=11, 1, `no`);
还有第三条路

update test set no = case id when 11 then 2 else no end

为清楚起见,这会对只有记录11的表进行自联接,从而只更新记录11(b.iD=11)。使用ON子句。

这不使用
where
子句,它可能比使用
if()
case
快一点:

update test A INNER JOIN test B 
  on A.ID = B.ID 
 and B.ID = 11
 set A.No = 2;
要更新表中的“第二”行,请选择id值第二小的行

update test t join
       (select 1 as dum) dum
       on t.id = 11
    set t.no = 2 ;
编辑

作为澄清上述查询结果的后续行动

如果
id
在表中不是唯一的,则查询可能会更新多行。内联视图查询(
s
)在按id值对行排序之后,从“第二”行获取id值。然后,将更新具有相同id值的所有行

只有当
id
不是唯一的时,这才是一个问题;如果
id
是唯一的,则语句将(最多)更新一行

例如,如果表的内容为:

UPDATE test t
  JOIN ( SELECT r.id
           FROM test r
          ORDER BY r.id 
          LIMIT 1,1
       ) s
    ON s.id = t.id
   SET t.no = 2

我想你的意思是“不”惊讶……)但是,是的,这会起作用-这是不可取的,但它确实回答了他的问题。哦,是的,一点也不奇怪。(编辑)问自己这个问题:为什么不想使用
where
子句?我怀疑你的问题背后有比你写的更多的东西。也许你真正的问题是你认为不使用这样的条款可以解决的其他问题。但这只会让我们很难提供帮助。所以,简单地解释你的问题,而不是你想如何解决它。我怀疑您正在寻找其他隐式方法来识别接收更新的行,而不是它的ID…下面的所有“答案”只是将where子句伪装成可读性较差的内容。@arkascha:其中一些技术可用于利用SQL注入漏洞。@arkascha。事实并非如此。下面使用
case
if
的解决方案的性能可能比使用
where
的版本差得多,尤其是当
id上有索引时(这是预期的)。即使没有索引,MySQL也会因注意到给定行不需要更新而产生开销,尽管开销较小,因为MySQL会忽略更新。@spencer7593是这样吗?寻找漏洞是开发人员日常工作的一部分。如果这是一个问题,那么我希望OP会询问它。
+-----+-----+
| id  | no  |
+-----+-----+
|   1 |   1 |
|  11 |   3 | <-- "second" row, ordered by id ascending 
|  11 |   4 | <-- id from third row matches id from second row
|  21 |   1 |
+-----+-----+
+-----+-----+
| id  | no  |
+-----+-----+
|   1 |   1 |
|  11 |   2 |  <-- updated
|  11 |   2 |  <-- updated
|  21 |   1 |
+-----+-----+