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 |
+-----+-----+