mysql update语句意外更新

c9x0cxw0  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(304)

为了更新mysql表,我使用了查询-

update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);

我错误地在where和execute处编写和执行了查询。
根据查询,我预期会出现错误,但它已成功运行。其次,我需要将所有行的状态更新为1。但是,所有行的状态都更新为0。(为什么?)
我试图找出原因和查询的微笑用法,但找不到。为什么会这样?为什么会这样?

35g0bw71

35g0bw711#

您的代码被解释为:

update TABLE
    set status = (1 and (finalStatus_id = 1) and (id in (1, 3, 4));

这是一个布尔表达式。当id为1、3或4且 finalStatus_id 是1。如果所有行都设置为 0 ,那么这永远不是真的。
您想要的查询大概是:

update TABLE
    set status = 1,
        finalStatus_id = 1 
where id in (1, 3, 4);

逗号用于将更新分隔为单独的列,而不是布尔值 and .

5w9g7ksd

5w9g7ksd2#

在sql中,where子句是可选的。更新表中的每一行是合法的语法,可以通过省略where子句来实现。

UPDATE table SET status=1;

也许这不是一个好的语言设计,默认情况下,您的更新将应用于每一行,但是这个标准的sql语法,无论是好是坏。
mysql客户端有一个标志 --safe-updates 从而防止意外执行此类查询。如果查询是update或delete并且没有where子句,则它将其视为错误。这只适用于mysql客户机,而不适用于任何编程接口。因此,如果在应用程序代码中犯同样的错误,它就不起作用。
下一部分是你设定你的目标 status 一个表达式。表达式可以是一个简单的值,如 1 ,但也可以是更复杂的表达式。
这是一个法律表达:

1 and finalStatus_id=1 and id in (1,3,4)

1 是同一件事 true ,它是 and . 另外两项也是布尔条件。
整个表达式的结果是布尔值 true 或者 false ,在mysql中相当于 1 或者 0 .
所以您将这个表达式应用于表中的每一行。当然会的 false 在每一排 id 不在(1,3,4)中。

相关问题