2013-03-15 4 views
1

J'ai eu un collègue aujourd'hui écrire une mise à jour SQL incorrectement écrite.Comment cette instruction de mise à jour fonctionne-t-elle?

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 

Pourquoi cela fonctionnerait-il?

Je pensais au plus mettre à jour 1 ligne avec ID étant unique. et 2402 et 2403 .... etc ne correspondant à rien.

+3

Elle a mis à jour chaque ligne de la table, car MySQL a interprété chaque ID de 2402 comme vrai. 'où ID = 2401 OU Vrai OU Vrai OU Vrai OU Vrai;' –

+4

Bienvenue dans le monde merveilleux de MySQL qui, au lieu de rejeter le code SQL incorrect, essaie de deviner ce que vous vouliez rendre votre vie plus facile. Je considère cela comme un bug dans MySQL - la syntaxe SQL est tout à fait fausse et ne devrait pas fonctionner en premier lieu. –

Répondre

8

Ce qui s'est passé est OR 2402 a été traitée comme une valeur vraie, comme si vous mettez 1 = 1 ou une autre condition qui renvoie toujours vrai. Votre requête a été lue par MySQL sous la forme

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

+1 exactement oui, ma réponse était OT. – Sajmon

2

Cette affirmation est erronée et mettrait à jour tous vos dossiers. La requête correcte est:

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

ou mieux:

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

votre dossier de mises à jour de la requête originale dont l'identifiant est 2401 et toute autre ligne pour laquelle considère que 2042 est « vrai » qu'il est pour tous (comme 2042 n'est pas 0 ou faux)

+1

Je comprends que c'était faux Je veux savoir pourquoi il a fait ce qu'il a fait. – Halfwarr

+2

Est-il possible que certaines des autres lignes aient déjà "changé" comme valeur de colonne? Ensuite, il ne serait pas mis à jour, et cela conduirait à une valeur «modifiée» inférieure au nombre total de lignes. – Ejzy

+0

@ ejzy qui était exactement la plupart des lignes ont été répertoriées comme "changer" les seules lignes qui n'étaient pas étaient les 264 qui ont été changés. – Halfwarr

Questions connexes