Incrementare un campo del database di 1


158

Con MySQL, se avessi un campo, ad esempio login, come potrei fare per aggiornare quel campo di 1 in un comando sql?

Sto cercando di creare una query INSERT, che crea firstName, lastName e login. Tuttavia, se esiste già la combinazione di firstName e lastName, incrementare gli accessi di 1.

quindi il tavolo potrebbe apparire così ..

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

John               Jones             1
Steve              Smith             3

Sto cercando un comando che, una volta eseguito, inserisca una nuova persona (ad esempio Tom Rogers) o aumenti gli accessi se John Jones fosse il nome utilizzato

Risposte:


288

Aggiornamento di una voce:

Un semplice incremento dovrebbe fare il trucco.

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

Inserisci una nuova riga o Aggiorna se già presente:

Se desideri aggiornare una riga esistente in precedenza o inserirla se non esiste già, puoi utilizzare la REPLACEsintassi o l' INSERT...ON DUPLICATE KEY UPDATEopzione (come ha dimostrato Rob Van Dam nella sua risposta ).

Inserimento di una nuova voce:

O forse stai cercando qualcosa del genere INSERT...MAX(logins)+1? In sostanza, eseguiresti una query molto simile alla seguente, forse un po 'più complessa a seconda delle tue esigenze specifiche:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
Inoltre, assicurati di aggiungere la tua clausola WHERE come appropriato alla tua applicazione.
BoltClock

Oh veramente!! Non sapevo che potresti farlo !!! Quindi funzionerebbe? INSERISCI IGNORA mytable (nome, cognome, accessi) VALORI (John, Smith, accessi = accessi + 1)
Matt

@Matt No, questo è un INSERT, non un UPDATE. Se desideri fare un inserto, dovrai ottenere il massimo e aggiungere 1 ad esso.
Sampson,

2
@Matt La tua domanda è stata posta " sull'aggiornamento di 1" che ha causato confusione. Penso che potresti cercare un'altra soluzione, a cui ho fatto riferimento nella mia risposta aggiornata.
Sampson,

1
@Jonathan Ci scusiamo per la confusione .. Ho aggiornato la mia domanda, speriamo che sia un po 'più chiara ..
Matt

70

Se puoi rendere sicuro (firstName, lastName) il PRIMARY KEY o almeno inserire un codice UNIQUE su di essi, puoi farlo:

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

Se non riesci a farlo, allora dovresti recuperare qualunque sia la chiave primaria prima, quindi non penso che potresti ottenere ciò che vuoi in una query.


1
La chiave primaria da 64+ byte non è un grande suggerimento
Jon Black,

Usando una variabile funzionerebbe al posto di '1'? cioè ON DUPLICATE KEY UPDATE login = login + numLogins; (formattato correttamente ovviamente)
Matt

1
Attenzione che ON DUPLICATE KEY UPDATEnon è completamente sicuro per la replica!
oucil,

2

Non hai detto cosa stai cercando di fare, ma hai accennato abbastanza bene nei commenti all'altra risposta. Penso che probabilmente stai cercando una colonna di incremento automatico

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

quindi non è necessario alcun codice speciale per l'inserimento. Appena

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

L'API MySQL ha funzioni per dirti quale ID utente è stato creato quando si esegue questa istruzione nel codice client.


2

Non sono esperto in MySQL ma probabilmente dovresti cercare i trigger, ad esempio PRIMA DELL'INSERIMENTO. Nel trigger è possibile eseguire la query di selezione sulla tabella originale e se ha trovato qualcosa basta aggiornare la riga 'login' invece di inserire nuovi valori. Ma tutto questo dipende dalla versione di MySQL in esecuzione.


2

Questa è più una nota a piè di pagina di una serie di risposte sopra che suggeriscono l'uso di ON DUPLICATE KEY UPDATE, ATTENZIONE che questa NON è sempre sicura per la replica, quindi se hai intenzione di crescere oltre un singolo server, vorrai evitare questo e usare due query , uno per verificare l'esistenza, e poi un secondo per sia UPDATE quando esiste una riga, o INSERTquando non è così.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.