2009-11-20 2 views
1

Почему баланс равен 1,00, когда выполняется команда sql ниже, независимо от того, какое значение имеет стоимость?Почему баланс равен 1,00, когда выполняется команда sql ниже, независимо от того, какое значение имеет стоимость?

update account set balance=balance-'$cost' and username='steven'" 

Значение баланса больше, чем $ стоимости на начальном этапе, после выполнения, баланс «Steven» становится 1.00. Что не так?

Скажем, когда первоначальный баланс 2000,00, то $ стоимость 300, после этого вычитания, баланс становится 1.00. Что случилось?

Я использую MySQL.

ответ

1

Вы забыли поставить в ГДЕ пункт:

UPDATE account SET balance=balance-'$cost' WHERE username='steven' LIMIT 1; 

Что происходит в вашем запросе

UPDATE account SET balance=balance-'$cost' AND username='steven'; 

Согласно MySQL Operator Precedence, то вычитание происходит первое, что , для примера, который вы дали, вернет положительное число:

UPDATE account SET balance=(balance-'$cost') AND username='steven'; 
UPDATE account SET balance=(1700) AND username='steven'; 

Затем присваивания (=) от имени пользователя к 'Steven' имеет место, который возвращает 'Steven':

UPDATE account SET balance=(1700) AND (username='steven'); 
UPDATE account SET balance=(1700) AND ('steven'); 

Затем, (И) логический оператор умирает, преобразует как положительное число и строка для логических значений, как TRUE, а затем Ands их, которая возвращает TRUE:

UPDATE account SET balance=((1700) AND ('steven')); 
UPDATE account SET balance=(TRUE AND TRUE); 
UPDATE account SET balance=(TRUE); 

Наконец, поскольку баланс является числом с плавающей точкой, TRUE преобразуется в число, которое по умолчанию равно 1,0:

UPDATE account SET balance=(TRUE); 
UPDATE account SET balance=1; 

Это затронет все записи, а не только один для пользователя «стив».

0

Запрос вы ищете, что делает то, что вы пытаетесь сделать (но, вероятно, до сих пор не так) является:

update account set balance=balance-'$cost', username='steven' 

Но, вероятно, вы хотите следующее? Или вы действительно пытаетесь установить баланс и имя пользователя для каждой строки в таблице по какой-то причине?

UPDATE account SET balance = balance - $cost WHERE username = 'steven' 
+0

Если ничего не происходит, то почему что-то происходит? т.е. баланс равен 1. Дополнительная двойная кавычка, вероятно, является ошибкой копирования/вставки. Нет, причина, по которой он устанавливается в одном, является логическим арифметическим. Я не мог точно рассказать, что оценивается и как, но 'AND' будет выполнять последний и оценивать значение' true', или 1 как число. –

0

В поисках очевидного ...

Я нахожу это странным, что вы бы изменить имя пользователя в то же самое время Вы пополняете баланс. Может быть, вы имели в виду «... где username = 'steven'"?

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

  • Нет связанных вопросов^_^