为了账号安全,请及时绑定邮箱和手机立即绑定

当仅在 where 子句中指定列名时,MySQL 会更新所有行

当仅在 where 子句中指定列名时,MySQL 会更新所有行

PHP
烙印99 2023-07-01 13:01:43
我已经有一段时间没有在 mysql 上工作了,我很惊讶地发现以下语句是有效的:UPDATE table_A SET col_a = valueWHERE id;看起来 MySQL 更新了表中的所有行。我有良好的 MSSQL 背景,我试图理解为什么这在 MySql 中有效?另外,我在 varchar 列上运行了一个具有类似 where 子句的查询:SELECT distinct descriptionFROM table_A where NOT description;我认为它只会返回 null 或空值。相反,它返回大量具有非空值的行。有什么想法吗?
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

WHERE xx将匹配计算结果为真值的任何行。由于BOOLEAN实际上是数字类型TINYINT(1),因此它的工作原理是转换为数字,然后与零进行比较 - 任何非零数字都是真实的。(NULL是假的。)

如果你写,那么仅对于isWHERE id = 123的行,表达式将计算为(与 相同)并且它会匹配,否则它将计算为()。id123id = 123TRUE1FALSE0

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

但是,在 的情况下description,您有一个字符串。并且字符串首先被转换为数字。您获得许多结果的原因是任何以数字(非零)开头的字符串都是匹配的,例如01234hello(转换为非零的 1234)。检查CONVERT(description, SIGNED)给出的内容 - 如果它非零,则它匹配。

这就是为什么在代码中构建ANDOR查询时,您可以通过以TRUEor 1(在这种AND情况下)或FALSEor 0(在这种OR情况下)开头来避免专门处理零条件的情况,因为WHERE TRUE/WHERE 1是有效的(匹配所有内容),就像WHERE FALSEWHERE 0(不匹配任何内容)。WHERE 1因此,您可以通过以下方式开始并添加以下内容来构建查询: WHERE 1WHERE 1 AND id = 123WHERE 1 AND id = 123 AND type = 'xy'等。


查看完整回答
反对 回复 2023-07-01
  • 1 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信