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 :

auto_increment dans un insert avec un select imbriqué


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut auto_increment dans un insert avec un select imbriqué
    Salut à tous,


    J'ai un soucis avec une requête sous MySQL 5, j'aimerais avoir votre avis.
    Voici la définition de la table dans laquelle j'aimerais insérer mes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE xfg_temp_unique.p_carac_temp 
    (
      `ID` int(11) NOT NULL auto_increment,
      `ÌD_OLD` int(11) default NULL,
      `DATEFIN` date default NULL,
      `ORDRE` int(11) default NULL,
      `TYPE` varchar(255) NOT NULL,
      `ACTIF` tinyint(1) default '0',
      `NOM` varchar(255) NOT NULL,
      `DATEDEBUT` date default NULL,
      `REGION` int(2) NOT NULL,
       PRIMARY KEY  (`ID`)
    )
    ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
    J'aimerais maintenant pouvoir insérer des données dans cette table sans mentionner de valeur pour l'auto_increment et en me basant sur le resultat du notre table à l'aide d'un select comme voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    insert into xfg_temp_unique.p_carac_temp 
    (ID, ID_OLD, DATEFIN, ORDRE, TYPE, ACTIF, NOM, DATEDEBUT, REGION) VALUES 
    (default, SELECT ID, DATEFIN, ORDRE, TYPE, ACTIF, NOM, DATEDEBUT, 01 
    from xfg_temp.p_matable);
    J'ai beau essayer de mettre default, null, last_insert_id() ou même mysql_insert_id(). Mais rien à faire.

    Ainsi comment je peux combiner une insert quoi dois être basé sur une requete pour tous les champs sauf 2
    +
    une valeur d'auto incrémentation (fourni ou pas ca m'est égal mais il faut qu'elle soit inseré)
    +
    une valeur determiné (une constante).


    En vous remerciant de votre éclairage

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Pour un INSERT c'est soit VALUES soit SELECT, et pour l'auto-increment il suffit de ne pas mentionner la colonne dans l'INSERT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO xfg_temp_unique.p_carac_temp (ID_OLD, DATEFIN, ORDRE, TYPE, ACTIF, NOM, DATEDEBUT, REGION)
    SELECT ID, DATEFIN, ORDRE, TYPE, ACTIF, NOM, DATEDEBUT, 1 
      FROM xfg_temp.p_matable
    A noter que 01 ne peut pas être inséré dans un integer, ce sera 1.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Merci à toi skuatamad cela marche.

    Par contre serais-tu pourquoi lorsque j'insère 242 lignes dans ma nouvelle table, la valeur de l'auto-increment est de 256 ?

    J'ai bien un COUNT(*) de 242 et à l'insertion mon select possède bien aussi 242 lignes. Pourtant si je fais de nouvelles insertion dans ma table il va recommencer la clé primaire à 256 au lui de 243 ?

    Bref mon auto_increment s'emballe et zappe des plages de données alors qu'elles ne sont pas utilisés.


    Je précise que mes variables system MySQL sont égal à :
    auto_increment_increment = 1
    auto_increment_offset = 1

    et que mon serveur MySQL est un serveur de dev en localhost sur lequel il n'existe que 1 base avec uniquement 2 tables (250lignes max)

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Peut-être aviez-vous commencé à insérer des lignes avant cette insertion en masse ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    malheureusement non puisque je créé la table exprès pour cette requête. Je l'ai même supprimé pour recommencer à nouveau le traitement.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ce n'est pas bien grave puisqu'un identifiant auto-incrémenté est une clé technique et sans signification.

    Ceci dit, si vous voulez repartir d'une situation vierge, vous pouvez forcer l'auto-incrément à repartir de zéro après avoir vidé la table.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Tout d'abord ça n'est pas un problème, ensuite c'est documenté :
    AUTO_INCREMENT Handling in InnoDB
    Gaps in auto-increment values for “bulk inserts”

    With innodb_autoinc_lock_mode set to 0 (“traditional”) or 1 (“consecutive”), the auto-increment values generated by any given statement will be consecutive, without gaps, because the table-level AUTO-INC lock is held until the end of the statement, and only one such statement can execute at a time.

    With innodb_autoinc_lock_mode set to 2 (“interleaved”), there may be gaps in the auto-increment values generated by “bulk inserts,” but only if there are concurrently executing “INSERT-like” statements.

    For lock modes 1 or 2, gaps may occur between successive statements because for bulk inserts the exact number of auto-increment values required by each statement may not be known and overestimation is possible.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    mmmm la variable system innodb_autoinc_lock_mode semble être très intéressante. Par contre je ne peux pas la modifier directement en SQL car MySQL m'indique qu'elle est en lecture seule.

    Néanmoins je ne la trouve pas dans les fichiers de configuration .ini de MySQL.

    Dois-je la rajouté à la mano dans mon my.ini ?

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Je ne vois pas l'intérêt, comme mentionné par Cinephil une PK autoincrémentée n'a pas de signification fonctionnelle, il n'y a aucun problème à avoir des trous.

    Sinon tu peux forcer la valeur de l'autoincrement comme le montre le lien ci-dessus vers la faq ou alors juste en redémarrant mysql la valeur de l'autoincrement devrait être remise à jour (tiré du précédent lien) :
    InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Je ne vois pas l'intérêt, comme mentionné par Cinephil une PK autoincrémentée n'a pas de signification fonctionnelle, il n'y a aucun problème à avoir des trous.
    J'aime à comprendre le comportement des technologies que je dois employer. Et celui-ci est plutôt étrange. Donc intérêt ou pas j'aimerais bien savoir pourquoi.

    Sinon tu peux forcer la valeur de l'autoincrement comme le montre le lien ci-dessus vers la faq
    - Il ne s'agit pas d'une table MyISAM
    - effacer et reconstruire la table n'a pas changer le comportement
    - le truncate non plus
    - le redémarrage du serveur non plus.

    redémarrant mysql la valeur de l'autoincrement devrait être remise à jour (tiré du précédent lien)
    Malheureusement cette solution ne marche pas non plus.


    Mais merci quand meme de ton aide skuatamad

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'émettrais bien une hypothèse mais peut-on voir la structure complète de la table xfg_temp.p_matable ?

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. insert avec un select imbriqué
    Par sebastien00 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/06/2008, 12h45
  3. Récupération de l'auto_increment dans l'insert en cours
    Par ultraboa dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 07/03/2006, 13h19
  4. [ SQL ] Faire un update avec un select imbriqué
    Par zozolh2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2005, 12h05
  5. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58

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