Incrémenter un champ de base de données de 1

158

Avec MySQL, si j'ai un champ, par exemple des connexions, comment pourrais-je mettre à jour ce champ de 1 dans une commande SQL?

J'essaie de créer une requête INSERT, qui crée firstName, lastName et les connexions. Cependant, si la combinaison de firstName et lastName existe déjà, incrémentez les connexions de 1.

donc le tableau pourrait ressembler à ceci.

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

John               Jones             1
Steve              Smith             3

Je suis après une commande qui, lorsqu'elle est exécutée, insérerait une nouvelle personne (par exemple, Tom Rogers) ou incrémenterait les connexions si John Jones était le nom utilisé.

Mat
la source

Réponses:

288

Mettre à jour une entrée:

Un simple incrément devrait faire l'affaire.

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

Insérer une nouvelle ligne, ou mettre à jour si déjà présent:

Si vous souhaitez mettre à jour une ligne déjà existante, ou l'insérer si elle n'existe pas déjà, vous pouvez utiliser la REPLACEsyntaxe ou l' INSERT...ON DUPLICATE KEY UPDATEoption (comme Rob Van Dam l'a démontré dans sa réponse ).

Insérer une nouvelle entrée:

Ou peut-être cherchez-vous quelque chose comme INSERT...MAX(logins)+1? Essentiellement, vous exécuteriez une requête semblable à la suivante - peut-être un peu plus complexe en fonction de vos besoins spécifiques:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
Sampson
la source
3
Veillez également à ajouter votre clause WHERE selon vos besoins à votre application.
BoltClock
Oh vraiment!! Je ne savais pas que tu pouvais faire ça !!! Alors, cela fonctionnerait-il? INSERT IGNORE mytable (firstName, lastName, logins) VALUES (John, Smith, logins = logins + 1)
Matt
@Matt Non, c'est un INSERT, pas un UPDATE. Si vous souhaitez faire une insertion, vous devrez obtenir le maximum et y ajouter 1.
Sampson
2
@Matt Votre question demandait "à propos de la mise à jour par 1", ce qui a semé la confusion. Je pense que vous cherchez peut-être une autre solution, que j'ai mentionnée dans ma réponse mise à jour.
Sampson
1
@Jonathan Désolé pour la confusion .. J'ai mis à jour ma question, j'espère que c'est un peu plus clair ..
Matt
70

Si vous pouvez créer en toute sécurité (firstName, lastName) la CLÉ PRIMAIRE ou au moins y mettre une clé UNIQUE, vous pouvez le faire:

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

Si vous ne pouvez pas faire cela, vous devrez d'abord récupérer la clé primaire, donc je ne pense pas que vous puissiez obtenir ce que vous voulez en une seule requête.

Barrage Rob Van
la source
1
La clé primaire de 64 octets ou plus n'est pas une bonne suggestion
Jon Black
L'utilisation d'une variable fonctionnerait-elle à la place du «1»? c'est-à-dire SUR LA MISE À JOUR DE LA CLÉ DUPLICATE logins = logins + numLogins; (formaté correctement bien sûr)
Matt
1
Attention, la ON DUPLICATE KEY UPDATEréplication n'est pas totalement sûre!
oucil
2

Vous n'avez pas dit ce que vous essayez de faire, mais vous l'avez assez bien fait allusion dans les commentaires de l'autre réponse. Je pense que vous recherchez probablement une colonne d'incrémentation automatique

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

alors aucun code spécial n'est nécessaire lors de l'insertion. Juste

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

L'API MySQL a des fonctions pour vous dire quel userid a été créé lorsque vous exécutez cette instruction dans le code client.

Ken Bloom
la source
2

Je ne suis pas expert en MySQL mais vous devriez probablement regarder les déclencheurs, par exemple AVANT D'INSERER. Dans le déclencheur, vous pouvez exécuter une requête de sélection sur votre table d'origine et si elle trouve quelque chose, mettez simplement à jour la ligne «connexions» au lieu d'insérer de nouvelles valeurs. Mais tout cela dépend de la version de MySQL que vous utilisez.

Serg Gulko
la source
2

Ceci est plus une note de bas de page à un certain nombre de réponses ci-dessus qui suggèrent l'utilisation de ON DUPLICATE KEY UPDATE, ATTENTION , ce n'est PAS toujours sûr pour la réplication, donc si vous prévoyez de vous développer au-delà d'un seul serveur, vous voudrez éviter cela et utiliser deux requêtes , une pour vérifier l'existence, puis une seconde pour soit UPDATE lorsqu'une ligne existe, soit INSERTlorsqu'elle n'existe pas.

oucil
la source