更新/递增多个MySQL列在一个查询

更新/递增多个MySQL列在一个查询

问题描述:

我有这个疑问,它的工作原理...更新/递增多个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

检查为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

乍一看查询看起来很好。什么是cost_to字段的类型?仔细检查它不是一个整数类型,因为你不会得到你正在寻找的结果。 (作为测试,4添加一个较大的值,说,到cost_to。)

我觉得你calls_to场int和cost_to场在不同的类型,所以只有你没有得到结果。检查字段的类型。

单表语法:

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