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 :

(debutant) Recuperer la derniere incrementation meme apres suppression


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut (debutant) Recuperer la derniere incrementation meme apres suppression
    bonjour à tous,

    Je voudrais savoir comment récupérer le dernier numéro de l'incrémentation d'une table ?

    Après recherche j'ai trouver ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'select * from clients where clients.client_no ORDER BY client_no DESC LIMIT 1';

    ou
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT max(clients.client_no) AS id FROM clients';
    ou encore avec :

    mais aucune ne me donne le résultat voulu !!

    exemple :
    j'ai 4 enregistrements dans ma table :
    1
    2
    3
    4
    si je supprime le 4eme les méthodes ci-dessus me retourne toutes 3 alors que la prochaine incrémentation sera 5 j'aimerai qu'une méthode me retourne 4 même si elle a été supprimée !!

    En fait, je voudrai le dernier numéro du compteur d'incrementation de la table dans mysql (si quelqu'un c'est faire !!!)

    Merci pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Tu peux trouver l'info dans un SHOW CREATE TABLE. Mais je ne vois pas du tout à quoi ça peut te servir ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Bonjour et merci pour ta reponse,

    en faite je veux récupéré le dernier "incrément" car je lui ajoute +1 pour incrémenter les foreign key des saisis futur ( je ne veux pas les noter sur un papier ) Je ne doute pas qu'il y ait d'autre solution mais étant plus que débutant j'essaie de faire au mieux !

    voici mes tables :
    Code sql : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
    --
    -- Structure de la table `clients`
    --
     
    CREATE TABLE IF NOT EXISTS `clients` (
      `client_no` int(11) unsigned NOT NULL auto_increment,
      `nom` varchar(100) NOT NULL,
      `prenom` varchar(100) NOT NULL,
      `adresse` varchar(100) NOT NULL,
      `codepostal` varchar(5) NOT NULL,
      `ville` varchar(100) NOT NULL,
      `telephone` varchar(14) NOT NULL,
      `email` varchar(100) NOT NULL,
      PRIMARY KEY  (`client_no`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    --
    -- Structure de la table `produit`
    --
     
    CREATE TABLE IF NOT EXISTS `produit` (
      `produit_no` int(11) unsigned NOT NULL auto_increment,
      `info` varchar(100) NOT NULL,
      `materiel` varchar(100) NOT NULL,
      `logiciel` varchar(100) NOT NULL,
      `os` varchar(100) NOT NULL,
      `internet` varchar(100) NOT NULL,
      `securite` varchar(100) NOT NULL,
      `backup` varchar(100) NOT NULL,
      `prix` int(6) NOT NULL,
      `frais_deplacement` int(3) NOT NULL,
      PRIMARY KEY  (`produit_no`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    --
    -- Structure de la table `vente`
    --
     
    CREATE TABLE IF NOT EXISTS `vente` (
      `vente_no` int(11) unsigned NOT NULL auto_increment,
      `nbre_heure` decimal(2,1) NOT NULL,
      `produit_no` int(11) unsigned ,
      `client_no` int(11) unsigned ,
      PRIMARY KEY  (`vente_no`),
      KEY `mon_produit` (`produit_no`),
      KEY `mon_client` (`client_no`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    --
    -- Contraintes pour la table `vente`
    --
    ALTER TABLE `vente`
      ADD CONSTRAINT `vente_ibfk_1` FOREIGN KEY (`produit_no`) REFERENCES `produit` (`produit_no`) ON DELETE CASCADE,
      ADD CONSTRAINT `vente_ibfk_2` FOREIGN KEY (`client_no`) REFERENCES `clients` (`client_no`) ON DELETE CASCADE;

    Et voci la page contenant ma requete :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php 
      session_start(); //doit être appelée avant toute utilisation des sessions
     
      include('create.php'); //on inclus la page de creation car on devrait avoir 3 ligne de reponse apres l'execution de la requete  
     
      if(isset($_SESSION['login']))
         {
     
    	 //création des requêtes SQL:
     
    	 //on insert la table CLIENTS avec les variable du formulaire create.php
         $sql1 = "INSERT  INTO clients(nom, prenom, adresse, codepostal, ville, telephone, email) VALUES ( '$nom','$prenom','$adresse','$codepostal','$ville','$telephone','$email')";
     
    	//on insert la table PRODUIT avec les variable du formulaire create.php
    	 $sql2 = "INSERT  INTO produit(info, materiel, logiciel, os, internet, securite, backup, prix, frais_deplacement) VALUES ( '$info','$materiel','$logiciel','$os','$internet','$securite','$backup','$prix','$frais_deplacement')";
     
    	//on insert la table VENTE avec les variable du formulaire create.php apres avoir recuperer le dernier enregistrement
    	$sql3 = "INSERT  INTO vente(nbre_heure, produit_no, client_no) VALUES ( '$nbre_heure','$produit_no','$client_no')";  
     
    	//on insert la table VENTE avec les variable du formulaire create.php et on recupere l'id clients.client_no et produit.produit_no et on les insert puis nombre d'heure par le formulaire
    	//$sql3 = "INSERT INTO vente(nbre_heure, produit_no, client_no) VALUES ('$nbre_heure', '(SELECT produit.produit_no FROM produit WHERE info='$info')' ,'(SELECT clients.client_no FROM clients WHERE nom='$nom' AND prenom='$prenom')' )";	
     
    		//connexion a la base de donnée
    		mysql_connect("localhost", "root", "passroot");
    		mysql_select_db("basededonnee");
    		//execution des requetes sql dans le bon ordre
    		$result1 = mysql_query($sql1);
    		$result2 = mysql_query($sql2);
     
     
    		//on verifie la bonne execution des requetes avec renvoi ok ou erreur 
    		if ($sql1) {
      echo "<p><center><font color=\"green\"><b> les données de la table CLIENTS ont bien été ajoutées !</b> </font></center><p>";
     
     
    			if ($sql2) {
      echo "<p><center><font color=\"green\"><b> les données de la table PRODUIT ont bien été ajoutées !</b> </font></center><p>";
      $result3 = mysql_query($sql3);
    } else {
      echo "<p><center><font color=\"red\"><b> Il y a eu un problème avec la table PRODUIT </b> </font></center><p>";
      echo "<p>" . mysql_error() . "</p>";
    }
     
     
     
     
     
    } else {
      echo "<p><center><font color=\"red\"><b> Il y a eu un problème avec le atble CLIENTS </b> </font></center><p>";
      echo "<p>" . mysql_error() . "</p>";
    }
     
     
    if ($sql3) {
      echo "<p><center><font color=\"green\"><b> les données de la table VENTE ont bien été ajoutées !</b> </font></center><p>";
    } else {
      echo "<p><center><font color=\"red\"><b> Il y a eu un problème avec le table VENTE </b> </font></center><p>";
      echo "<p>" . mysql_error() . "</p>";
    }
    mysql_close();
     
     
     
     
     
     
    	 }  else {
    	 echo "connexion close !! <br> <a href=\"index.html\">retour</a> ";
    	 }
    ?>
    On peu voir qu'il y a 2 requêtes en $sql3 dont une en commentaire car quand j'active celle-ci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql3 = "INSERT INTO vente(nbre_heure, produit_no, client_no) VALUES ('$nbre_heure', '(SELECT produit.produit_no FROM produit WHERE info='$info')' ,'(SELECT clients.client_no FROM clients WHERE nom='$nom' AND prenom='$prenom')' )";

    pour rechercher les clefs primaire des tables "clients" et "produit" afin d'incrementer les foreign key de la table "vente" ca ne marche pas : erreur mysql
    Donc je les recupere et les inclus avec +1 dans mon formulaire ca marche tant qu'il n'y a pas de suppression de donnée ce que j'explique plus haut !!

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Citation Envoyé par SWATswat Voir le message
    Bonjour et merci pour ta reponse,

    en faite je veux récupéré le dernier "incrément" car je lui ajoute +1 pour incrémenter les foreign key des saisis futur ( je ne veux pas les noter sur un papier ) Je ne doute pas qu'il y ait d'autre solution mais étant plus que débutant j'essaie de faire au mieux !
    Je m'en doutais, mais ce n'est pas très solide comme façon de faire (un jour, j'aimerais bien qu'on m'explique pourquoi tout le monde veut alimenter manuellement les numéros automatiques ).

    En effet, suppose que tu aies deux utilisateurs à la fois, Alain et Béa. Le scénario suivant risque d'arriver :
    1. Alain regarde l'état de la table et voit que la dernière ID est 5 ; il choisit donc d'insérer en 6
    2. Béa regarde l'état de la table et voit que la dernière ID est 5 ; elle choisit donc d'insérer en 6
    3. Alain insère sa donnée avec l'ID 6
    4. Béa tente d'insèrer sa donnée avec l'ID 6, et se fait jeter parce que l'ID en question est déjà prise


    La méthode correcte est donc d'insérer sans affecter d'ID (cf http://mysql.developpez.com/faq/?pag...CREMENT_insert), et au besoin de récupérer la valeur attribuée après l'insertion avec LAST_INSERT_ID (en SQL) ou mysql_insert_id (en PHP).

    Le scénario devient donc :
    1. Alain insère sa donnée ; MySQL lui attribue l'ID 6
    2. Béa insère sa donnée ; MySQL lui attribue l'ID 7

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    La raison est simple, quand je récupère le dernier id et que je l'incrémente via une requête ça ne fonctionne pas pour le premier enregistrement (juste après la création de mes tables) et ça ne fonctionne plus après avoir supprimer un enregistrement :

    j'ai A, B, C ils reçoivent l'incrémentation auto A1, B2, C3 donc le prochain ID sera 4 !! Si je supprime C dont l'ID est 3 avec ma requête ci dessous il me récupère le dernier qui pour lui est 2 au lieu de me donner 3 car je le rappel le suivant est 4 !!

    J'ai essayer avec 3 façon différentes comme dit sur le post plus haut et toujours le même résultat. donc mon manque de maitrise ainsi que ce problème m'amène a faire comme cela, c'est pour ca que je m'oriente vers vous pour en apprendre un peu plus et surtout comprendre ce que l'on me dis ce qui est déjà plus difficile parfois !!

    voici la requete pour incrementer automatiquement mes foreign key :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql3 = "INSERT INTO vente(nbre_heure, produit_no, client_no)
     VALUES ('$nbre_heure', 
       '(SELECT produit.produit_no FROM produit WHERE info='$info')' ,
       '(SELECT clients.client_no FROM clients WHERE nom='$nom' AND prenom='$prenom')' 
    )";

    enfin si vous avez une solution ou une explication je suis preneur !! pendant ce temps je vais lire le lien que tu m'as donné !

    Grand merci a vous !

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Citation Envoyé par SWATswat Voir le message
    voici la requete pour incrementer automatiquement mes foreign key :

    (...)

    enfin si vous avez une solution ou une explication je suis preneur !! pendant ce temps je vais lire le lien que tu m'as donné !
    En résumé, tu n'as pas à incrémenter tes clés primaires, parce qu'elles s'incrémentent toutes seules.

    Par exemple, tu crées un client :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "INSERT INTO Clients (nom, prenom, ...)
      VALUES ('Lambert', 'Gérard', ...) ;"
    mysql_query($sql) or die(mysql_error()) ;
    $IDclient = mysql_insert_id() ;

    Tu peux maintenant insérer ses achats :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "INSERT INTO Ventes (nbre_heure, produit_no, client_no)
      VALUES (2, 456, $IDclient) ; " ;
    mysql_query($sql) or die(mysql_error()) ;
    $IDvente = mysql_insert_id() ; /* si besoin */

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

Discussions similaires

  1. Champ incrementé ne se réinitialise pas après suppression
    Par pierrot67 dans le forum Bases de données
    Réponses: 15
    Dernier message: 09/06/2007, 19h28
  2. Réponses: 5
    Dernier message: 22/05/2006, 15h53
  3. Réponses: 2
    Dernier message: 09/05/2005, 14h08
  4. [langage] recuperer le dernier mot dune ligne
    Par kacedda dans le forum Langage
    Réponses: 6
    Dernier message: 29/04/2003, 15h38

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