2013-03-15 3 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 строку с уникальным идентификатором. и 2402 и 2403 .... и т. д. не сопоставляются ни с чем.

+3

Он обновил каждую строку таблицы, поскольку MySQL интерпретировал каждый идентификатор из 2402 как истинный. 'где ID = 2401 ИЛИ Истина ИЛИ Истина ИЛИ Истина ИЛИ Истина;' –

+4

Добро пожаловать в чудесный мир MySQL, который вместо отказа от неправильного SQL пытается угадать, что вы хотели сделать своей жизнью проще. Я считаю, что это ошибка в MySQL - синтаксис SQL явно неправильный и не должен работать в первую очередь. –

ответ

8

Что произошло OR 2402 было рассмотрено как истинное значение, как если бы вы положили 1 = 1 или другое условие, которое всегда возвращает true. Ваш запрос был прочитан MySQL как

+0

+1 точно да, мой ответ был ОТ. – Sajmon

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); 

оригинал обновление запроса запись с идентификатором 2401 и любая другая строка, для которой справедливо, что 2042 является «истинным», который он для всех (поскольку значение 2042 не равно 0 или false)

+1

Я понимаю, что это было неправильно. Я хочу знать, почему он сделал то, что сделал. – Halfwarr

+2

Возможно ли, что некоторые другие строки уже «изменились» как значение столбца? Тогда он не будет обновлен, и это приведет к «измененному» значению ниже общего количества строк. – Ejzy

+0

@ejzy, который был именно таким, что большинство строк были перечислены как «изменение», единственными строками, которые не были, были 264, которые были изменены. – Halfwarr

Смежные вопросы