为了更新MySql表,我使用了查询-
update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);
我错误地编写并代替了何处并执行查询。
根据查询,我期待错误,但它运行成功。其次,我应该将所有行的状态更新为 1。 但 所有行的状态都更新为 0。(为什么会这样?
我试图找出查询的原因和 smililar 使用,但找不到。 这是为什么呢?为什么它表现得这样?
您的代码被解释为:
update TABLE
set status = (1 and (finalStatus_id = 1) and (id in (1, 3, 4));
这是一个布尔表达式。 仅当 id 为 1、3 或 4 且finalStatus_id
的值为 1 时,它才会为"1"(true)。 如果所有行都设置为0
,则这永远不会为真。
您想要的查询大概是:
update TABLE
set status = 1,
finalStatus_id = 1
where id in (1, 3, 4);
逗号用于将更新分隔到单独的列,而不是布尔and
。
在 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) 中的每一行。