2010-07-29 63 views
3

我有這個疑問,它的工作原理...更新/遞增多個MySQL列在一個查詢

UPDATE `contacts` 
     SET `calls_to`=`calls_to`+1 
    WHERE `contact_no` = '0412345678'; 

我也想要做的是一個價值增加了​​成本的項目。從我的理解,順便做這將是...

UPDATE `contacts` 
     SET `calls_to` = `calls_to`+1, 
      `cost_to` = `cost_to`+0.25 
    WHERE `contact_no`='0412345678'; 

很明顯,因爲我在這裏發帖,它不工作,因爲我期望的那樣。

--UPDATE--

按照要求,表結構..

id     int(255) auto_increment 
contact_owner varchar(255) 
contact_no  varchar(11) 
contact_name varchar(255) 
calls_to   int(255) 
txts_to    int(255) 
time_talked_to int(255) 
cost_to   decimal(65,2) 
+0

發生了什麼事?查詢看起來不錯。 – mdma 2010-07-29 04:49:00

+0

你能發佈你的數據庫模式嗎?你也可以發佈'SELECT * FROM contacts WHERE contact_no ='0412345678''的結果嗎?順便說一下,我認爲最好總是添加一個「LIMIT 1」來更新你不希望影響多於一行的更新:) – Hamy 2010-07-29 04:51:12

+0

@mdma:我的猜測是'cost_to'是一個INT數據類型,所以在UPDATE中添加的十進制被截斷。我看不出還有什麼可能。 ...而你的回答是*所以*不存在。 – 2010-07-29 04:51:13

回答

3

檢查爲cost_to的數據類型爲int,或者如果它的價值not.Also更新列不爲空。

UPDATE `contacts` 
     SET `calls_to` = `calls_to`+1, 
      `cost_to` = `cost_to`+0.25 
    WHERE `contact_no`='0412345678' AND 
      calls_to is not null AND 
      cost_to is not null; 
+0

這似乎工作。謝謝:D (注意,我必須將calls_to和cost_to的默認設置爲0.) – ajdi 2010-07-29 05:03:56

1

乍一看查詢看起來很好。什麼是cost_to字段的類型?仔細檢查它不是一個整數類型,因爲你不會得到你正在尋找的結果。 (作爲測試,4添加一個較大的值,說,到cost_to。)

0

我覺得你calls_to場int和cost_to場在不同的類型,所以只有你沒有得到結果。檢查字段的類型。

0

單表語法:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
[WHERE where_condition] 
[ORDER BY ...] 
[LIMIT row_count] 

多表語法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references 
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
[WHERE where_condition] 

對於單表的語法,在現有行的UPDATE語句更新列用新值命名錶。子句SET子句指示要修改哪些列以及應該給出哪些值。每個值都可以作爲表達式給出,或者使用關鍵字DEFAULT將列明確設置爲其默認值。 WHERE子句(如果給出)指定標識要更新哪些行的條件。使用否WHERE子句,將更新所有行。如果指定了ORDER BY子句,則按照指定的順序更新行。 LIMIT子句會限制可更新的行數。

對於多表語法,更新更新table_references中命名的滿足條件的每個表中的行。即使匹配條件多次,每個匹配行也會更新一次。對於多表的語法,不能用ORDER BYLIMIT