1

我今天让一位同事编写了一个编写不正确的 SQL 更新。

UPDATE table SET column  = 'change'
WHERE id = 2401 OR 2402 OR 2403 OR 2404 OR 2405 OR 2406;


Query OK, 264 rows affected (0.03 sec)
Rows matched: 9997 Changed: 264  Warnings: 0

为什么会这样?

我认为它最多会更新 1 行,ID 是唯一的。和 2402 和 2403....等不匹配任何东西。

4

2 回答 2

8

发生的事情OR 2402被视为真值,就好像您放置1 = 1或另一个始终返回真值的条件一样。MySQL 将您的查询读取为

UPDATE table SET column  = 'change'
WHERE id = 2401 OR true OR true OR true OR true OR true;
于 2013-03-15T21:18:46.627 回答
2

该声明是错误的,并且会更新您的所有记录。正确的查询是:

UPDATE table 
SET column  = 'change'
WHERE id = 2401 OR id= 2402 OR id=2403 OR id=2404 OR id=2405 OR id=2406;

或更好:

UPDATE table 
SET column  = 'change'
WHERE id IN (2401,2402,2403,2404,2405,2406);

您的原始查询更新 id 为 2401 的记录以及任何其他保持 2042 为“true”的行,它适用于所有人(因为 2042 不是 0 或 false)

于 2013-03-15T21:14:26.753 回答