为了更新mysql表,我使用了查询-
update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);
我错误地在where和execute处编写和执行了查询。
根据查询,我预期会出现错误,但它已成功运行。其次,我需要将所有行的状态更新为1。但是,所有行的状态都更新为0。(为什么?)
我试图找出原因和查询的微笑用法,但找不到。为什么会这样?为什么会这样?
为了更新mysql表,我使用了查询-
update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);
我错误地在where和execute处编写和执行了查询。
根据查询,我预期会出现错误,但它已成功运行。其次,我需要将所有行的状态更新为1。但是,所有行的状态都更新为0。(为什么?)
我试图找出原因和查询的微笑用法,但找不到。为什么会这样?为什么会这样?
2条答案
按热度按时间35g0bw711#
您的代码被解释为:
这是一个布尔表达式。当id为1、3或4且
finalStatus_id
是1。如果所有行都设置为0
,那么这永远不是真的。您想要的查询大概是:
逗号用于将更新分隔为单独的列,而不是布尔值
and
.5w9g7ksd2#
在sql中,where子句是可选的。更新表中的每一行是合法的语法,可以通过省略where子句来实现。
也许这不是一个好的语言设计,默认情况下,您的更新将应用于每一行,但是这个标准的sql语法,无论是好是坏。
mysql客户端有一个标志
--safe-updates
从而防止意外执行此类查询。如果查询是update或delete并且没有where子句,则它将其视为错误。这只适用于mysql客户机,而不适用于任何编程接口。因此,如果在应用程序代码中犯同样的错误,它就不起作用。下一部分是你设定你的目标
status
一个表达式。表达式可以是一个简单的值,如1
,但也可以是更复杂的表达式。这是一个法律表达:
自
1
是同一件事true
,它是and
. 另外两项也是布尔条件。整个表达式的结果是布尔值
true
或者false
,在mysql中相当于1
或者0
.所以您将这个表达式应用于表中的每一行。当然会的
false
在每一排id
不在(1,3,4)中。