4 Stimmen

Aktualisieren/Ergänzen mehrerer MySQL-Spalten in einer Abfrage

Ich habe diese Abfrage, die funktioniert...

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

Außerdem möchte ich dem Kostenfeld einen Wert hinzufügen. Nach meinem Verständnis wäre der Weg, dies zu tun ...

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

Da ich hier schreibe, funktioniert es natürlich nicht so, wie ich es erwarten würde.

--UPDATE--

Wie gewünscht, die Tabellenstruktur

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 Stimmen

Was geschieht hier? Die Abfrage sieht gut aus.

0 Stimmen

Können Sie Ihr Datenbankschema veröffentlichen? Könnten Sie auch das Ergebnis von SELECT * FROM contacts WHERE contact_no='0412345678' ? Nebenbei bemerkt, halte ich es für eine gute Praxis, immer eine LIMIT 1 für Aktualisierungen, von denen Sie nicht erwarten, dass sie mehr als 1 Zeile betreffen :)

0 Stimmen

@mdma: Meine Vermutung ist, dass die cost_to ist ein INT-Datentyp, so dass die in UPDATE hinzugefügte Dezimalzahl abgeschnitten wird. Ich wüsste nicht, was es sonst sein könnte. ...und Ihre Antwort war also nicht da.

5voto

Salil Punkte 44916

Prüfen Sie, ob der Datentyp für cost_to Aktualisieren Sie die Spalte auch, wenn ihr Wert nicht null ist.

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;

1voto

mdma Punkte 55529

Auf den ersten Blick sieht die Abfrage gut aus. Was ist der Typ der cost_to Feld? Vergewissern Sie sich, dass es sich nicht um einen Integraltyp handelt, da Sie dann nicht das gewünschte Ergebnis erhalten. (Fügen Sie testweise einen größeren Wert, beispielsweise 4, zu cost_to hinzu).

0voto

Karthik Punkte 3167

Ich denke, Ihr calls_to Feld als int und cost_to Feld als in einem anderen Typ, so dass nur Sie nicht das Ergebnis erhalten haben. Überprüfen Sie den Typ des Feldes.

0voto

Amirtha Rajan Punkte 566

Ein-Tabellen-Syntax:

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

Mehrere-Tabellen-Syntax:

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

Bei der Einzeltabellen-Syntax wird die UPDATE Anweisung aktualisiert Spalten bestehender Zeilen in der genannten Tabelle mit neuen Werten. Die SETZEN Klausel gibt an, welche Spalten zu ändern sind und welche Werte sie erhalten sollen. Jeder Wert kann als Ausdruck angegeben werden, oder das Schlüsselwort DEFAULT um eine Spalte explizit auf ihren Standardwert zu setzen. Die Website WHERE Klausel, falls angegeben, gibt die Bedingungen an, die bestimmen, welche Zeilen zu aktualisieren sind. Mit nein WO Klausel, werden alle Zeilen aktualisiert. Wenn die ORDER BY Klausel angegeben ist, werden die Zeilen in der angegebenen Reihenfolge aktualisiert. Die LIMIT Klausel begrenzt die Anzahl der Zeilen, die aktualisiert werden können.

Für die Syntax mit mehreren Tabellen, UPDATE aktualisiert Zeilen in jeder in table_references genannten Tabelle, die die Bedingungen erfüllen. Jede übereinstimmende Zeile wird einmal aktualisiert, auch wenn sie die Bedingungen mehrfach erfüllt. Für die Syntax für mehrere Tabellen, ORDER BY y LIMIT kann nicht verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X