没有where

时间:2015-05-12 17:50:41

标签: mysql sql

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

我想更新第2行没有。到2。 我可以使用的查询是

update test set no = 2 where id = 11;

如何在没有where子句的情况下实现相同的目标?

5 个答案:

答案 0 :(得分:4)

我不确定为什么你想要但是......

UPDATE `test` SET `no` = IF(`id`=11, 1, `no`);

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

答案 1 :(得分:2)

要更新表中的“第二”行,那么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

修改

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

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

仅当id 唯一时才会出现此问题;如果id是唯一的,则该语句将更新(最多)一行。

例如,如果表的内容是:

+-----+-----+
| 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值为11两个行。

+-----+-----+
| id  | no  |
+-----+-----+
|   1 |   1 |
|  11 |   2 |  <-- updated
|  11 |   2 |  <-- updated
|  21 |   1 |
+-----+-----+

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

还有第三种方式......

update test A INNER JOIN test B 
  on A.ID = B.ID 
 and B.ID = 11
 set A.No = 2;

为了清楚起见,这在仅具有记录11的表上进行自联接,因此仅更新记录11(b.iD = 11)。使用ON子句。

答案 4 :(得分:1)

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

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