12
votes

Problème avec MySQL Insérer max () + 1

J'ai une seule table contenant de nombreux utilisateurs. Dans ce tableau, j'ai eu une colonne appelée user_id (int), que je veux une augmentation séparément pour chaque personne. user_id doit démarrer à 1

J'ai préparé un exemple simple: xxx

La requête suivante fera cela, mais cela ne fonctionnera que si "Bob" existe déjà dans La table ... xxx

si Bob n'existe pas (première entrée) user_id est défini sur 0 (zéro). C'est le problème. J'ai besoin de l'user_id pour commencer à partir de 1 non pas 0.


0 commentaires

4 Réponses :


1
votes

n'utilise pas max () + 1 alors. Utilisez un schéma de numérotation automatique sur la table.

Je n'ai pas lu la question correctement. Utilisez la suggestion de Greg d'IFNULL ().


2 commentaires

Ne sera pas un schéma de numérotation automatique sur le numéro de table chaque enregistrement de manière séquentielle, plutôt que de faire le premier "Bob" 1 et du second "Bob" 2, et le premier "Tchad" 1, puis deuxième "Tchad" 2 et ainsi de suite ?


Je n'ai pas lu la question correctement. Je vais reporter à la réponse de Greg avec ifnull ().



6
votes

Vous pouvez utiliser ifnull :

INSERT INTO users(user_id, name)
SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';


4 commentaires

On dirait que cela fonctionnerait mais pour une raison quelconque MySQL jette une erreur de syntaxe: ... Syntaxe à utiliser à proximité 'Sélectionner max (user_id) +1 à partir des utilisateurs où nom =' Bob '), 1),' Bob '' à la ligne 1


@Chad: remplacer ifnull ( avec ifnull (( et fonctionnera, ce sont des parenthèses déséquilibrées.


Oui, c'est pourquoi cela n'a pas fonctionné. Je me demande quelle méthode est plus rapide / meilleure.


Oups, fixe le support manquant. Il y a très peu de différence entre le mien et les réponses de @ Lukas - utilisez la plus facile à lire / à comprendre.



17
votes

Vous pouvez utiliser quelque chose comme ceci: xxx

mais une telle requête peut conduire à une condition de course. Assurez-vous que vous êtes dans une transaction et vous verrouillez la table des utilisateurs avant de l'exécuter. Sinon, vous risquez de vous retrouver avec deux bobs avec le même numéro.


2 commentaires

Oui, la requête fonctionne, mais s'il vous plaît ne pas ignorer la deuxième partie. :) Ou si vous décidez de l'ignorer, créez au moins un index unique sur (nom, user_id) de sorte que la requête qui produise autrement une duplication échoue.


C'était ma question suivante, c'est ici: Stackoverflow.com/questions/1590648/...



3
votes

Il a été signalé comme un bogue dans MySQL .

Je cite Guilhem Bichot:

Deuxièmement, voici le plus simple des solutions de contournement:
Au lieu d'utiliser:
Insérez dans les valeurs FOO (LFD) ((Sélectionnez Max (LFD) de FOO) +1)
juste faire
Insérer dans FOO (LFD) Sélectionnez (max (LFD) +1) de FOO;


0 commentaires