web-dev-qa-db-fra.com

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

Avec MySQL, si j'ai un champ, par exemple des connexions, comment le mettre à jour par 1 dans une commande sql?

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

donc la table pourrait ressembler à ceci ..

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

John               Jones             1
Steve              Smith             3

Je cherche une commande qui, une fois lancée, insère une nouvelle personne (Tom Rogers) ou incrémente des connexions si John Jones était le nom utilisé.

142
Matt

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 existante ou l'insérer si elle n'existe pas déjà, vous pouvez utiliser la syntaxe _ (REPLACE) ou INSERT...ON DUPLICATE KEY UPDATE option (As Rob Van Dam 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 très 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
_
265
Sampson

Si vous pouvez créer en toute sécurité (firstName, lastName) la clé primaire ou tout au moins leur attribuer une clé unique, procédez comme suit:

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

Si vous ne pouvez pas faire cela, alors vous devrez extraire ce que la clé primaire est en premier, alors je ne pense pas que vous puissiez obtenir ce que vous voulez en une seule requête.

69
Rob Van Dam

Vous n’avez pas dit ce que vous essayez de faire, mais vous l’avez assez bien laissé entendre dans les commentaires de l’autre réponse. Je pense que vous cherchez probablement une colonne à 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 sur l'insertion. Juste

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

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

2
Ken Bloom

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

2
Serg Gulko

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 qu'il s'agit de PAS toujours sécurisé pour la réplication, donc, si vous envisagez de vous étendre 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 quand une ligne existe, ou INSERT quand ce n'est pas le cas.

1
oucil