小编典典

不带where子句的更新

sql

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

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

update test set no = 2 where id = 11;

没有where子句,我怎么能达到相同的效果?


阅读 174

收藏
2021-05-23

共1个答案

小编典典

要更新表格中的“第二”行,该行具有第二个最小的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表中不唯一的情况下,查询可能会更新 多个
行。s在按ID值对行进行排序之后,内联视图查询()从“第二”行获取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 |
+-----+-----+
2021-05-23