【问题标题】:MySQL updates all rows when the column name is only specified in the where clause当列名仅在 where 子句中指定时 MySQL 更新所有行
【发布时间】:2020-06-25 17:46:30
【问题描述】:

好久没搞mysql了,惊讶地发现下面的说法是有效的:

UPDATE table_A 
SET col_a = value
WHERE id;

看起来 MySQL 更新了表中的所有行。我有良好的 MSSQL 背景,我想了解为什么这在 MySql 中有效?

另外,我在 varchar 列上运行了一个带有类似 where 子句的查询:

SELECT distinct description
FROM table_A 
where NOT description;

我认为它只会返回 null 或空值。相反,它返回大量具有非空值的行。

有什么想法吗?

谢谢,

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    WHERE x 将匹配 x 评估为真值的任何行。因为BOOLEAN 实际上是一个数字类型TINYINT(1),所以它的工作原理是转换为一个数字,然后与零进行比较——任何非零数字都是真实的。 (NULL 是假的。)

    如果你写WHERE id = 123,那么只有id123 的行,表达式id = 123 将计算为TRUE(与1 相同)并且它会匹配,否则它将评估为FALSE (0)。

    但如果你写WHERE id,则要求id 计算为真值。如果 id 是一个数字,则只有 ID 0NULL 是假的。

    但是,对于description,您有一个字符串。并且首先将字符串转换为数字。你得到很多结果的原因是任何以数字(非零)开头的字符串都匹配,例如01234hello(转换为非零的1234)。检查 CONVERT(description, SIGNED) 给出的内容 - 如果它不为零,则匹配。

    这就是为什么在代码中构建ANDOR 查询时,您可以通过特别以TRUE1 开头(在AND 情况下)来避免处理零条件的情况) 或FALSE0(在OR 的情况下),因为WHERE TRUE/WHERE 1 是有效的(匹配所有内容),WHERE FALSE/WHERE 0(不匹配任何内容)也是有效的。因此,您可以从 WHERE 1 开始构建查询,然后添加:WHERE 1WHERE 1 AND id = 123WHERE 1 AND id = 123 AND type = 'xy' 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多