Erhöhen Sie ein Datenbankfeld um 1

158

Wenn ich mit MySQL ein Feld habe, beispielsweise Anmeldungen, wie würde ich dieses Feld innerhalb eines SQL-Befehls um 1 aktualisieren?

Ich versuche, eine INSERT-Abfrage zu erstellen, die Vorname, Nachname und Anmeldungen erstellt. Wenn die Kombination aus Vorname und Nachname jedoch bereits vorhanden ist, erhöhen Sie die Anmeldungen um 1.

so könnte die Tabelle so aussehen ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

Ich bin nach einem Befehl, der beim Ausführen entweder eine neue Person (z. B. Tom Rogers) einfügt oder die Anmeldungen erhöht, wenn John Jones der verwendete Name ist.

Matt
quelle

Antworten:

287

Einen Eintrag aktualisieren:

Ein einfaches Inkrement sollte den Trick machen.

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

Neue Zeile einfügen oder Aktualisieren, falls bereits vorhanden:

Wenn Sie eine zuvor vorhandene Zeile aktualisieren oder einfügen möchten, falls sie noch nicht vorhanden ist, können Sie die REPLACESyntax oder die INSERT...ON DUPLICATE KEY UPDATEOption verwenden (wie Rob Van Dam in seiner Antwort gezeigt hat ).

Einfügen eines neuen Eintrags:

Oder suchen Sie so etwas INSERT...MAX(logins)+1? Im Wesentlichen würden Sie eine Abfrage wie die folgende ausführen - je nach Ihren spezifischen Anforderungen möglicherweise etwas komplexer:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
Sampson
quelle
3
Stellen Sie außerdem sicher, dass Sie Ihrer Anwendung die entsprechende WHERE-Klausel hinzufügen.
BoltClock
Ja wirklich!! Ich wusste nicht, dass du das kannst !!! Würde das also funktionieren? INSERT IGNORE mytable (Vorname, Nachname, Logins) VALUES (John, Smith, Logins = Logins + 1)
Matt
@ Matt Nein, das ist ein INSERT, kein UPDATE. Wenn Sie eine Einfügung vornehmen möchten, müssen Sie das Maximum ermitteln und 1 hinzufügen.
Sampson
2
@Matt Ihre Frage lautete "über die Aktualisierung um 1", was die Verwirrung verursachte. Ich denke, Sie suchen möglicherweise nach einer anderen Lösung, auf die ich in meiner aktualisierten Antwort verwiesen habe.
Sampson
1
@ Jonathan Entschuldigung für die Verwirrung .. Ich habe meine Frage aktualisiert, hoffentlich ist das ein bisschen klarer ..
Matt
70

Wenn Sie sicher (Vorname, Nachname) zum PRIMÄREN SCHLÜSSEL machen oder zumindest einen EINZIGARTIGEN Schlüssel darauf setzen können, können Sie dies tun:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

Wenn Sie das nicht können, müssen Sie zuerst den Primärschlüssel abrufen, sodass Sie nicht in einer Abfrage das erreichen können, was Sie wollen.

Rob Van Dam
quelle
1
64+ Byte Primärschlüssel ist kein guter Vorschlag
Jon Black
Würde die Verwendung einer Variablen anstelle der '1' funktionieren? dh ON DUPLICATE KEY UPDATE logins = logins + numLogins; (natürlich richtig formatiert)
Matt
1
Beachten Sie, dass dies ON DUPLICATE KEY UPDATEnicht vollständig replikationssicher ist!
Oucil
2

Sie haben nicht gesagt, was Sie versuchen, aber Sie haben es in den Kommentaren zur anderen Antwort gut genug angedeutet. Ich denke, Sie suchen wahrscheinlich nach einer Spalte für die automatische Inkrementierung

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

dann wird beim Einfügen kein spezieller Code benötigt. Gerade

insert into logins (username, password) values ('user','pass');

Die MySQL-API verfügt über Funktionen, die Ihnen mitteilen, welche Benutzer-ID erstellt wurde, als Sie diese Anweisung im Client-Code ausführen.

Ken Bloom
quelle
2

Ich bin kein Experte für MySQL, aber Sie sollten sich wahrscheinlich Trigger ansehen, z. B. VOR EINFÜGEN. Im Trigger können Sie eine Auswahlabfrage für Ihre ursprüngliche Tabelle ausführen. Wenn etwas gefunden wurde, aktualisieren Sie einfach die Zeile 'logins', anstatt neue Werte einzufügen. Dies hängt jedoch von der Version von MySQL ab, die Sie ausführen.

Serg Gulko
quelle
2

Dies ist eher eine Fußnote zu einer Reihe der obigen Antworten, die die Verwendung von BEWARE vorschlagen ON DUPLICATE KEY UPDATE. Beachten Sie, dass dies NICHT immer replikationssicher ist. Wenn Sie also jemals vorhaben , über einen einzelnen Server hinauszuwachsen, sollten Sie dies vermeiden und zwei Abfragen verwenden , eine, um die Existenz zu überprüfen, und eine zweite, um entweder UPDATE eine Zeile zu existieren oder INSERTnicht.

oucil
quelle