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

我已经有一段时间没有在 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 或空值。相反,它返回大量具有非空值的行。


有什么想法吗?


烙印99
浏览 109回答 1
1回答

蛊毒传说

WHERE xx将匹配计算结果为真值的任何行。由于BOOLEAN实际上是数字类型TINYINT(1),因此它的工作原理是转换为数字,然后与零进行比较 - 任何非零数字都是真实的。(NULL是假的。)如果你写,那么仅对于isWHERE id = 123的行,表达式将计算为(与 相同)并且它会匹配,否则它将计算为()。id123id = 123TRUE1FALSE0但如果你写WHERE id,则要求id计算结果为真值。如果id是一个数字,则只有 ID 0,NULL将是假的。但是,在 的情况下description,您有一个字符串。并且字符串首先被转换为数字。您获得许多结果的原因是任何以数字(非零)开头的字符串都是匹配的,例如01234hello(转换为非零的 1234)。检查CONVERT(description, SIGNED)给出的内容 - 如果它非零,则它匹配。这就是为什么在代码中构建AND或OR查询时,您可以通过以TRUEor 1(在这种AND情况下)或FALSEor 0(在这种OR情况下)开头来避免专门处理零条件的情况,因为WHERE TRUE/WHERE 1是有效的(匹配所有内容),就像WHERE FALSE/ WHERE 0(不匹配任何内容)。WHERE 1因此,您可以通过以下方式开始并添加以下内容来构建查询: WHERE 1、WHERE 1 AND id = 123、WHERE 1 AND id = 123 AND type = 'xy'等。
打开App,查看更多内容
随时随地看视频慕课网APP