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: p> La requête suivante fera cela, mais cela ne fonctionnera que si "Bob" existe déjà dans La table ... p> 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. p> p>
4 Réponses :
n'utilise pas max () + 1 alors. Utilisez un schéma de numérotation automatique sur la table. Strike> P>
Je n'ai pas lu la question correctement. Utilisez la suggestion de Greg d'IFNULL (). P>
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 ().
Vous pouvez utiliser ifnull :
INSERT INTO users(user_id, name) SELECT(IFNULL((SELECT MAX(user_id)+1 from users where name='Bob'), 1), 'Bob';
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 ( code> avec
ifnull (( code> 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.
Vous pouvez utiliser quelque chose comme ceci: 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. P> p>
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) code> de sorte que la requête qui produise autrement une duplication échoue.
C'était ma question suivante, c'est ici: Stackoverflow.com/questions/1590648/...
Il a été signalé comme un bogue dans MySQL . P>
Je cite Guilhem Bichot: P>
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; P> blockQuote>