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

MySQL Discussion :

Connaître le dernier identifiant


Sujet :

MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 144
    Points : 88
    Points
    88
    Par défaut Connaître le dernier identifiant
    Bonjour
    je désire avec MySQL récupérer le dernier identifiant (auto-incrément) créé par INSERT;
    je peux utiliser : select last_distinct_id(), juste après le INSERT.
    Mais si la table est modifiée par un autre utilisateur entre temps, je risque de récupérer son identifiant, non ?
    est ce qu'une bonne solution serait de verrouiller la table avant d'insérer, de récupérer l'identifiant, puis de déverrouiller la table ?
    Merci ![

  2. #2
    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 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut lepatantpato.

    Citation Envoyé par lepatantpato
    je peux utiliser : select last_distinct_id(), juste après le INSERT.
    Cette fonction n'existe pas ! C'est "last_insert_id()".
    --> https://dev.mysql.com/doc/refman/5.7...last-insert-id

    Citation Envoyé par lepatantpato
    est ce qu'une bonne solution serait de verrouiller la table avant d'insérer, de récupérer l'identifiant, puis de déverrouiller la table ?
    Vous devez garder à l'esprit que vous n'êtes pas seul à travailler sur vos tables MySql.
    Dans votre cas, vous devez être en mode transactionnel lors de l'insertion de votre nouvelle ligne.
    Vous récupérez la valeur de votre identifiant auto incrémenté avant de vous en servir pour alimenter une clef étrangère dans une autre table.
    Lorsque votre grappe de données est terminée, alors vous pouvez faire un "commit". Dans le cas contraire, vous faites un "rollback".

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    start transaction;
    insert into `table_1` (col1, ... , col9) values (.. , ... , ...);
    
    set @id = last_insert_id();
    
    insert into `table_2` (col1, ... , id) values (.. , ... , &id);
    commit;
    --> http://php.net/manual/fr/pdo.lastinsertid.php

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

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    La réponse est dans la FAQ MySQL.
    La fonction LAST_INSERT_ID() renvoie le dernier numéro automatique attribué au cours de la session. Il n'y a donc pas de risque de conflit avec une session concurrente.

    @+
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 144
    Points : 88
    Points
    88
    Par défaut Dernier identifiant
    Bonjour
    merci à vous deux.
    Effectivement, j'avais inventé last_distinct_id()....
    Cela dit, l'utilisation des transactions me convient fort bien.
    Dans le cas de la récupération de l'identifiant mais aussi dans le cas suivant.
    J'ai un compteur qui s'alimente dans une ligne de table ainsi (numéro de facture) :
    à chaque nouvelle facture, le numéro s'incrémente.
    Avec une transaction :
    -je débute une transation
    -je mets à jour ce numéro
    -je fais la facture avec le nouveau numéro
    -je ferme la transaction.
    Encore merci !

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 144
    Points : 88
    Points
    88
    Par défaut
    Bonjour
    Voici une fonction qui me permet de récupérer le dernier identifiant après un insert.
    Elle fonctionne.
    Ma question porte sur la succession de mysqli_query. Ai je raison de procéder ainsi ?
    (j'ai essayé sans succès mysqli_Multi_query).
    Merci !



    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function Insertion($Parametre) 
    { 
      $conn=SiteConnexion(); 
      $sql="start TRANSACTION;"; 
      mysqli_query($conn,$sql); 
      mysqli_query($conn,$Parametre); 
      $DernierId=mysqli_insert_id($conn); 
      $sql="commit;"; 
      mysqli_query($conn,$sql); 
      SiteDeconnexion($conn); 
      return $DernierId; 
    } 
     
    $NumeroId=Insertion("insert into agents (nom,id_societe) values ('lolote',553)"); 
    if ($NumeroId==0) 
    {
      echo "Pas d'insert".sl;
    }
    else 
    {
      echo "insert ok = ".$NumeroId.sl;
    }

  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 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut lepatantpato.

    Citation Envoyé par lepatantpato
    Cela dit, l'utilisation des transactions me convient fort bien.
    L'utilisation des transactions est obligatoire en mode multithreading car vous devez être le seul à intervenir sur une portion de la base de données.
    Sans cela, vous risquez d'avoir un problème d'intégrité !

    Citation Envoyé par lepatantpato
    Dans le cas de la récupération de l'identifiant mais aussi dans le cas suivant.
    Non, ce sont deux problèmes différents.

    La récupération de l'identifiant se fait de la même façon quelque soit les utilisateurs.
    Il y a juste l'obligation d'ouvrir une session sinon vous ne résolvez rien du tout.

    Encore que par le mode transation, vous travaillez sur une grappe de donnée, et que l'autre utilisateur aura accès à ces données que si vous faites un commit, mais pas avant.

    Citation Envoyé par lepatantpato
    J'ai un compteur qui s'alimente dans une ligne de table ainsi (numéro de facture) : à chaque nouvelle facture, le numéro s'incrémente.
    Mais il s'incrémente comment ? Par l'auto incrémentation comme je le suppose.
    Donc, pour obtenir cette incrémentation, vous devez faire un "insert".

    C'est juste après l'insertion, disons dans la foulé, que vous devez faire votre "last_insert_id()" pour récupérer la valeur de votre identifiant.
    Je vous conseille de faire une seule ligne d'insertion à la fois dans votre requête.

    Pour reprendre votre fonction, vous devez externaliser (hors de la fonction) la connexion à votre base de données.
    Idem pour la déconnexion de la base de données.
    Cela se fait une seule fois durant votre session, dans votre script php.

    Pour votre fonction, vous devez utiliser les fonctions php :
    --> commit pour valider la transaction.
    --> rollback pour rejeter la transaction.
    --> [utl=http://php.net/manual/fr/mysqli.autocommit.php]Autocommit[/url] afin de le désactiver.
    --> [utl=http://php.net/manual/fr/mysqli.begin-transaction.php]start transaction[/url].
    pour les principales fonctions php. Pour le reste voire le lien ci-après :
    --> http://php.net/manual/fr/book.mysqli.php

    Voici un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /*=================================*/
    /*     Mise à jour d'une ligne     */
    /*=================================*/
     
    $link->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
     
    $query = 'update `tab_exemple` set `libelle` = \'douze\' where `date` = \'2015-08-27\';';
     
    if (!mysqli_query($link,$query))
    {
    	printf("Erreur Query : %s\n", mysqli_error($link));
    	mysqli_rollback($link);
    	exit();
    }
     
    printf("Nombre de lignes mises à jours : %d\n\n", mysqli_affected_rows($link));
     
    mysqli_commit($link);
    A vous de faire une recherche sur le net et de vous adresser au forum php pur avoir plus d'explication.

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

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 144
    Points : 88
    Points
    88
    Par défaut
    Ok, merci !

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il serait préférable d'éviter de gérer les transaction depuis le code client.
    D'une part, cela augmente la durée des transactions (aller/retour client/serveur). Or, il convient de garder les transactions les plus courtes possible afin de libérer au plus tôt les verrous posés par celles-ci.
    D'autre part, en cas de plantage coté client, il faut s'assurer que la transaction est bien annulée.

    Il serait donc mieux de créer une procédure stockée pour gérer cette insertion.

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

Discussions similaires

  1. Dernier identifiant inséré
    Par creezeer dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 31/05/2006, 18h32
  2. [Sybase]recuperation du dernier identifiant
    Par jeff_! dans le forum Sybase
    Réponses: 4
    Dernier message: 24/04/2006, 15h13
  3. connaître le dernier enregistrement ?
    Par gobs dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/02/2006, 20h42
  4. Comment connaître le dernier jour d'un mois donné ?
    Par Le Pharaon dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 11/07/2005, 10h48
  5. Comment connaître le dernier noeud d'un TreeView ?
    Par marie253 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 02/09/2004, 13h15

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