2013-03-15 128 views
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 ....等没有与任何东西匹配。

+3

它更新表中的每一行,因为MySQL将每个ID从2402解释为true。 '在哪里ID = 2401或真或或真或真或真;' – 2013-03-15 21:14:19

+4

欢迎来到MySQL的美妙世界,而不是拒绝不正确的SQL试图猜测你的意思,让你的生活更轻松。我认为这是MySQL中的一个错误 - SQL语法显然是错误的,不应该放在第一位。 – 2013-03-15 21:21:33

回答

8

发生了什么事是OR 2402被视为一个真正的价值,就好像你把1 = 1或其他条件总是返回true。您的查询被MySQL读取为

UPDATE table SET column = 'change' 
WHERE id = 2401 OR true OR true OR true OR true OR true; 
+0

+1正好是,我的回答是OT。 – Sajmon 2013-03-15 21:22:27

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是“真”,它是所有(因为2042不是0或错误)

+1

我知道这是错误的,我想知道它为什么做它做了什么。 – Halfwarr 2013-03-15 21:16:35

+2

是否有可能某些其他行已经“更改”为列值?然后它不会被更新,并且会导致“更改”的值低于总行数。 – Ejzy 2013-03-15 21:22:19

+0

@ejzy正是它的大部分行被列为“变更”,唯一没有被更改的行是264。 – Halfwarr 2013-03-15 21:24:47