+------+------+
| id | no |
+------+------+
| 1 | 1 |
| 11 | 1 |
| 21 | 1 |
+------+------+
我想更新第2行没有。到2。 我可以使用的查询是
update test set no = 2 where id = 11;
如何在没有where子句的情况下实现相同的目标?
答案 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 ;