2013-03-15 72 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