Incrementar un campo de base de datos en 1

158

Con MySQL, si tengo un campo, por ejemplo, inicios de sesión, ¿cómo haría para actualizar ese campo en 1 dentro de un comando sql?

Estoy tratando de crear una consulta INSERT, que crea nombre, apellido e inicios de sesión. Sin embargo, si la combinación de firstName y lastName ya existe, incremente los inicios de sesión en 1.

entonces la mesa podría verse así ...

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

John               Jones             1
Steve              Smith             3

Estoy detrás de un comando que, cuando se ejecuta, inserta una nueva persona (es decir, Tom Rogers) o aumenta los inicios de sesión si John Jones era el nombre utilizado ...

Mate
fuente

Respuestas:

288

Actualización de una entrada:

Un incremento simple debería hacer el truco.

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

Insertar nueva fila o Actualizar si ya está presente:

Si desea actualizar una fila previamente existente o insertarla si aún no existe, puede usar la REPLACEsintaxis o la INSERT...ON DUPLICATE KEY UPDATEopción (como demostró Rob Van Dam en su respuesta ).

Insertar una nueva entrada:

¿O tal vez estás buscando algo así INSERT...MAX(logins)+1? Esencialmente, ejecutaría una consulta muy similar a la siguiente, quizás un poco más compleja según sus necesidades específicas:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
Sampson
fuente
3
Además, asegúrese de agregar su cláusula WHERE según corresponda a su aplicación.
BoltClock
¡¡Oh enserio!! ¡No sabía que pudieras hacer eso! Entonces, ¿esto funcionaría? INSERTAR IGNORE mytable (firstName, lastName, logins) VALUES (John, Smith, logins = logins + 1)
Matt
@ Matt No, eso es un INSERT, no un UPDATE. Si desea hacer una inserción, necesitará obtener el máximo y agregarle 1.
Sampson
2
@Matt Su pregunta fue "sobre actualizar eso en 1", lo que causó la confusión. Creo que puede estar buscando otra solución, a la que he hecho referencia en mi respuesta actualizada.
Sampson
1
@ Jonathan Perdón por la confusión ... He actualizado mi pregunta, espero que eso sea un poco más claro ...
Matt
70

Si puede hacer de forma segura (firstName, lastName) la PRIMARY KEY o al menos ponerles una clave UNIQUE, entonces puede hacer esto:

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

Si no puede hacer eso, entonces tendría que buscar lo que sea esa clave primaria primero, por lo que no creo que pueda lograr lo que desea en una consulta.

Rob Van Dam
fuente
1
La clave principal de 64 bytes no es una gran sugerencia
Jon Black,
¿Usaría una variable trabajar en lugar del '1'? es decir, EN ACTUALIZACIÓN DE CLAVE DUPLICADA logins = logins + numLogins; (formateado correctamente, por supuesto)
Matt
1
¡Cuidado que la ON DUPLICATE KEY UPDATEreplicación no es completamente segura!
oucil
2

No dijiste lo que intentas hacer, pero lo insinuaste bastante bien en los comentarios a la otra respuesta. Creo que probablemente estés buscando una columna de incremento automático

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

entonces no se necesita un código especial en la inserción. Sólo

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

La API MySQL tiene funciones para indicarle qué ID de usuario se creó cuando ejecuta esta instrucción en el código del cliente.

Ken Bloom
fuente
2

No soy experto en MySQL, pero probablemente deberías buscar activadores, por ejemplo, ANTES DE INSERTAR. En el activador, puede ejecutar la consulta de selección en su tabla original y, si encuentra algo, simplemente actualice la fila 'inicios de sesión' en lugar de insertar nuevos valores. Pero todo esto depende de la versión de MySQL que esté ejecutando.

Serg Gulko
fuente
2

Esto es más una nota al pie de una serie de respuestas anteriores que sugieren el uso de ON DUPLICATE KEY UPDATE, CUIDADO , que esto NO siempre es seguro para la replicación, por lo que si alguna vez planea crecer más allá de un solo servidor, querrá evitar esto y usar dos consultas , uno para verificar la existencia, y luego a una segunda ya sea UPDATE cuando existe una fila, o INSERTcuando no lo hace.

oucil
fuente