2010-07-29 17 views
3

J'ai cette requête, qui fonctionne ...Mise à jour/Incrémenter plusieurs colonnes MySQL dans une requête

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

Ce que je veux aussi faire est d'ajouter une valeur au champ des coûts. De ma compréhension, la façon de le faire serait ...

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

De toute évidence, comme je signale ici, il ne fonctionne pas comme je l'attendre.

--UPDATE--

Comme demandé, la structure de la table ..

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

Que se passe-t-il? La requête semble correcte. – mdma

+0

Pourriez-vous poster votre schéma de base de données? Aussi pourriez-vous poster le résultat de 'SELECT * FROM contacts WHERE contact_no = '0412345678''? En aparté, je crois que c'est une bonne pratique d'ajouter toujours un 'LIMIT 1' aux mises à jour que vous ne prévoyez pas affecter plus d'une rangée :) – Hamy

+0

@mdma: Je suppose que le' cost_to' est une donnée INT type, la décimale ajoutée dans UPDATE est tronquée.Je ne vois pas ce que ça pourrait être d'autre. ... et votre réponse était * donc * pas là. –

Répondre

3

Vérifiez si le type de données pour cost_to est int ou pas. Mettez également à jour la colonne si sa valeur n'est pas nulle.

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

Cela a semblé fonctionner. Merci: D (note secondaire, j'ai dû mettre la valeur par défaut pour calls_to et cost_to à 0.) – ajdi

1

À première vue la requête semble bien. Quel est le type du champ cost_to? Vérifiez que ce n'est pas un type intégral, puisque vous n'obtiendrez pas le résultat que vous recherchez. (À titre de test, ajoutez une valeur plus grande, disons, 4 à cost_to.)

0

Je pense que votre champ calls_to en tant que champ int et cost_to en tant que type différent, donc seulement vous n'avez pas obtenu le résultat. Vérifiez le type du champ.

0

syntaxe Table unique:

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

syntaxe multi-table:

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

Pour la syntaxe table unique, les colonnes mises à jour des états UPDATE des lignes existantes dans la table nommée avec de nouvelles valeurs. La clause SET indique les colonnes à modifier et les valeurs à indiquer. Chaque valeur peut être donnée en tant qu'expression ou le mot-clé DEFAUT pour définir explicitement une colonne à sa valeur par défaut. La clause WHERE, si elle est spécifiée, spécifie les conditions qui identifient les lignes à mettre à jour. Avec aucune clause WHERE, toutes les lignes sont mises à jour. Si la clause ORDER BY est spécifiée, les lignes sont mises à jour dans l'ordre spécifié. La clause LIMIT place une limite sur le nombre de lignes pouvant être mises à jour.

Pour la syntaxe à tables multiples, UPDATE met à jour les lignes de chaque table nommée dans table_references qui satisfont aux conditions. Chaque ligne correspondante est mise à jour une fois, même si elle correspond plusieurs fois aux conditions. Pour la syntaxe à tables multiples, ORDER BY et LIMIT ne peuvent pas être utilisés.

Questions connexes