IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Connaître le prochain numéro d'une table


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut Connaître le prochain numéro d'une table
    Bonjour,

    Je souhaite savoir s'il est possible de connaître le prochain numéro d'une table.
    Dans ma table commande j'ai une id sans AUTO_INCREMENT (de toutes façons ça ne changerait sans doute rien) alors, je fais un SELECT COUNT pour connaître le nombre d'entrées mais comment savoir le numéro de l'id la plus élevée ?
    Je pense que AUTO_INCREMENT ou pas, on peut supprimer une entrée donc le nombre de lignes ne correspondrait pas. Alors comment faire et, est-ce possible ?
    Je vous remercie de votre aide.

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Un devrait fait l'affaire ?
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Il faudrait faire SELECT MAX(Id) + 1... mais c'est une mauvaise idée.
    Que se passe-t-il si plusieurs utilisateurs ajoutent une ligne en même temps ?

    L'auto-incrément gère cela tout seul et sans risque de collision.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il faudrait faire SELECT MAX(Id) + 1... mais c'est une mauvaise idée.
    Que se passe-t-il si plusieurs utilisateurs ajoutent une ligne en même temps ?

    L'auto-incrément gère cela tout seul et sans risque de collision.
    Même avec un seul autre utilisateur en MàJ, ça ne fonctionne pas non plus : si vous faites cette requête avant que l'insert de l'autre thread soit commité, le résultat obtenu sera inférieur à la valeur maxi réelle qui sera celle après commit...
    Si l'autre thread est un traitement batch qui fait des ajouts en masse, vous serez même très en dessous de la valeur réelle !
    De plus, il me semble que les id non commités sont perdus (j'ai un doute sur MySQL qui ne gère pas les attributions d'identifiants par lots, mais j'en suis certain sur d'autres SGBD), à vérifier, car en ce cas il y a des trous,
    Si le dernier id commité est par exemple la valeur 10 et qu'une transaction en cours abandonne l'insertion, le prochain ID commité sera ... le 12 !

  5. #5
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut
    Je ne connaissais pas SELECT MAX(Id) + 1.
    Ce que je voulais en fait c'est connaître le numéro de l'incrémentation avant ajout et, en AUTO_INCREMENT je ne pense pas que cela soit possible à part avec SELECT MAX(Id) + 1. J'essaie juste d'incrémenter un numéro de commande tout en connaissant ce dernier avant validation du formulaire.

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    Pour gérer correctement votre identifiant, le mieux est de le définir auto incrémenté, comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `id`   integer unsigned NOT NULL auto_increment primary key,
    1) ne pas faire référence à cette colonne dans les insert.
    Autrement dit, laissez MySql se débrouiller tout seul pour faire l'incrémentation.

    2) comment connaitre la dernière valeur insérée ?
    Rien de plus simple, il existe une fonction MySql (last_insert_id()) qui permet de faire cela :
    --> http://dev.mysql.com/doc/refman/5.7/...last-insert-id

    3) le last_insert_id(), c'est en MySql Pure. Et qu'en est-il avec php ?
    Il existe une fonction aussi de nom mysqli_insert_id
    --> http://php.net/manual/fr/mysqli.insert-id.php

    4) c'est une très mauvaise idée de faire un "select max(id)+1" car le temps nécessaire n'est pas négligeable.
    D'autre part, il se peut aussi qu'entre le moment où vous faites cette recherche et le moment où vous faites l'insertion, quelqu'un d'autre l'aura déjà fait avant vous.

    5) l'intérêt d'avoir la dernière valeur de l'insertion, doit se faire après l'insertion, quand la valeur est figée dans votre ligne.
    Le faire avant l'insertion n'a aucun sens, car quelqu'un d'autre peut récupérer cette valeur avant vous.
    Donc vous ne devez faire qu'un simple "insert" et non un "insert multiple".
    Après un insert, il faut mieux faire un "commit" afin de valider votre requête.

    La last_insert_id() doit se faire juste après l'insertion. Boire les exemples données sur le net à ce sujet.

    6) il existe une autre façon, un peu plus lourde qui consiste à interroger la valeur de l'auto_increment de votre table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --------------
    SELECT AUTO_INCREMENT as last_id
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE  table_schema = 'base' and table_name = 'test'
    --------------
     
    +---------+
    | last_id |
    +---------+
    |     814 |
    +---------+
    7) le commit et le rollback n'ont aucune influence sur la valeur de l'auto_increment.
    Autrement dit, comme son nom l'indique, la valeur de l'auto_increment est toujours augmenté de +1 à chaque insertion, même après un rollback.

    8) vous avez la possibilité, à vos risques et périls, de renuméroter cette auto_increment.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut
    Merci beaucoup dorénavant j'en sais bien plus.

  8. #8
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut
    Une question quand même: comment font-ils dans les logiciels de facturation pour afficher le numéro de commande avant validation ?

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par barale61 Voir le message
    Une question quand même: comment font-ils dans les logiciels de facturation pour afficher le numéro de commande avant validation ?
    Première solution : ils prévalident, par exemple avec un objet SEQUENCE que MySQL n'implémente pas (il est tellement en retard sur les autres SGBDR...)
    Deuxième solution : création d'une facture bidon avec apparition du bon numéro puis update de cette facture bidon avec les bonnes valeurs à saisir (dans ce cas il est impératif de passer par des vues pour éviter de présenter les factures bidon)
    Troisième solution : le n° de facture est indépendant de l'auto incrément et est calculé par un mécanisme propriétaire protégé par une transaction qui empêche la distribution de doublon, ce que j'explique dans cet article : http://sqlpro.developpez.com/cours/clefs/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 176
    Points : 90
    Points
    90
    Par défaut
    J'ai bien lu cet article et finalement, je vais garder l'AUTO_INCREMENT.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Telephone IP avec numéro dans une table
    Par selverine dans le forum VBA Access
    Réponses: 8
    Dernier message: 24/01/2012, 21h25
  2. Comment connaître le dernier enregistrement d'une table?
    Par THOMAS Patrice dans le forum SQL
    Réponses: 6
    Dernier message: 11/05/2010, 12h53
  3. Réponses: 4
    Dernier message: 28/12/2009, 21h42
  4. Réponses: 1
    Dernier message: 22/02/2006, 09h02
  5. Réponses: 2
    Dernier message: 27/10/2005, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo