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

Administration MySQL Discussion :

Données Excel vers MySQL


Sujet :

Administration MySQL

  1. #21
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Voici un exemple d'utilisation de PHP que j'ai trouvé sur le forum php !
    https://www.daniweb.com/programming/...ollback-in-php

  2. #22
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Coeur de pirat.

    Citation Envoyé par Coeur de Pirat
    Les deux commandes suivantes , que signifient elles exactement ?
    La première commande sert à récupérer le nom du batch.
    Si le script batch windows que tu lances se nomme "base.bat", et bien il va récupérer "base.bat".

    La seconde commande va remplacer le ".bat" par le ".sql".
    Ce qui implique que le script doit porter le même nom que le script batch sql.

    Citation Envoyé par Coeur de Pirat
    Dans ce script quel ligne dit qu'il faut exécuter le script Sql?
    C'est cette ligne qui exécute le script sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql < %FIC%  --verbose  --force
    Dans la variable "%FIC%", il y a le nom du script sql.
    Dans mon exemple de ci-dessus, il s'agit du nom "base.sql".

    Citation Envoyé par Coeur de Pirat
    est ce qu'il y'a une information sur le fichier Excel que je vais importer
    Le fichier Excel que tu dois importer est déclaré dans le script sql.
    Il n'y a aucune information concernant ce fichier Excel dans le script batch windows.

    Citation Envoyé par Coeur de Pirat
    est ce qu'il serait pas mieux de le faire en script PHP car les lignes de commandes je n'y travaille jamais avec ? c'est tout nouveau pour moi !
    Ca dépend de ce que tu fais avec.

    Si c'est à la demande, ou si tu fais du bidouillage, un script en ligne de commande est très utile.
    Inversement, si tu veux automatiser le traitement, tout dépend de ce que tu désires faire aussi.
    L'exemple du lien que tu donnes sert uniquement à faire des requêtes : "mysql_query". Et en plus, ton exemple est obsolète !

    Je pense que pour l'instant, essaye de mettre au point tes script sql, avant de penser à les automatiser.
    Dans ces scripts, il y a des créations de tables de travail, des chargements depuis un fichier Excel et des traitements de dispatching des données dans les tables existentes.

    Si tu veux vraiment les encapsuler dans du php, il faudra t'investir dans le php et en particulier dans le pdo mysql qui est plus moderne que le php mysql : http://php.net/manual/fr/ref.pdo-mysql.php

    Pour le php, même dans le cadre de mysql, il vaut mieux s'adresser au forum php.

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

  3. #23
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Salut artemus 24,
    merci beaucoup pour tes réponses précieuses!
    Ok donc je continue avec le script batch pour le moment, enfaite ce que je fais c'est un import d'un fichier Excel dans la base de données, comme vous me l'avez indiqué depuis le début de la discussion ! J'ai procédé colonne par colonne pour réaliser mes requêtes car ya des insert pour insérer les données dans le bon endroit , maintenant il va falloir regrouper toutes les requêtes dans un seul script !
    voila le script batch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @echo off
     
    setlocal enableDelayedExpansion
     
    chcp 1252 > nul
     
    set PATH="C:\Program Files\MySQL\MySQL Workbench 6.3 CE";%PATH%
     
    SET FIC=%~nx0
    SET FIC=%FIC:bat=sql%
     
    echo FIC=%FIC%
    mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < %FIC%  --force
    pause
    et ci dessous le code sql avec un exemple de deux requêtes car le fichier est très lent !
    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
    set autocommit = 0;
    start transaction;
    use base_configuration_test;
     
    LOAD DATA LOCAL INFILE 'C:\\programmes\\capteurs.csv'
        INTO TABLE base_configuration_test.trad_M2M
        CHARACTER SET utf8
        FIELDS TERMINATED BY ';'
        ENCLOSED BY '"'
        ESCAPED BY '\\' LINES
    	TERMINATED BY '\r\n'
        IGNORE 0 LINES
     
       (A1,A2,@C3,@C4,@C5,@C6,@C7,@C8,@C9,B,@C11,@C12,@C13)
       set   P   = trim(@C3),
              f = replace(@C4, ',', '.'),
              l= replace(@C5, ',', '.'),
              H = trim(@C6),
              lenght = replace(@C7, ',', '.'),
              Radius= replace(@C8,',','.'),
              frequency  = replace(@C9,',','.'),
             Element   = replace(@C11,',','.'),
             Elementquantity  = trim(@C12),
             M_Capteur = trim(@C13)
           -- commit
    INSERT  INTO `base_configuration_test`.`model` (model_number,id_image,id_nature,id_constructeur)              
    SELECT  CONCAT(P,'-', A2) as model_number ,
           null as id_image,
           2 as id_nature,
           236 as id_constructeur 
    from `base_configuration_test`.`trad_olympus`
     
    INSERT INTO  base_configuration_test.materiel (serie, fichier,id_model)
    SELECT  DISTINCT '00000' as serie , NULL  as fichier ,  m.id_model as id_model     
    FROM   base_configuration_test.model m 
    order by  m.id_model 
    commit;
    set autocommit = 1;
    QUESTIONS:
    Au niveau des 3 premières lignes ainsi que les dernières , et entre les requêtes y'a rien à mettre pour séparer dans le script sql?

    Merci de votre réponse !

    l’exécution du script batch me donne des erreurs et pourtant j'ai testé toutes les requêtes une à une pour s'assurer qu'il n’y a pas d'erreurs
    Nom : image.png
Affichages : 96
Taille : 11,9 Ko
    Merci bien
    Bonne soirée

  4. #24
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Cœur de Pirat.

    Le script batch windows est toujours le même. Donc il ne change pas dans son contenu.

    Citation Envoyé par Cœur de Pirat
    le code sql avec un exemple de deux requêtes car le fichier est très lent !
    Admettons que votre fichier Excel vient à charger une seule table. Et vous avez plusieurs Excel à traiter.
    Qu'est-ce qui vous empêche de lancer vos exécutions en parallèle ?
    Il n'y aura aucun télescopage car chaque fichier Excel vient travailler avec sa table.

    Admettons que maintenant, vos fichiers Excel viennent à travailler avec plusieurs tables, ce qui est le cas, je crois.
    Dans ce cas là, il faut introduire la notion de "transaction" dans vos traitements.
    C'est ce que l'on trouve dans les scripts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set autocommit = 0;
    start transaction;
    ...
    Commit;
    set autocommit = 1;
    Voir la documentation MySql à ce sujet : http://dev.mysql.com/doc/refman/5.7/en/commit.html

    Plus le fichier Excel est gros et plus le temps du chargement sera long.
    Il vaut mieux faire plusieurs petits fichiers Excel et les lancer un par un, que d'en faire un seul énorme.

    Citation Envoyé par Cœur de Pirat
    entre les requêtes y'a rien à mettre pour séparer dans le script sql?
    Vous pouvez toujours mettre des commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -- =====================
    -- Création Table 'Test'
    -- =====================
    Il y a aussi une chose que vous pouvez faire, au lieu d'un énorme script SQL.
    Soit vous créez un script sql chapeau contenant par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    source prog_1.sql
    source prog_2.sql
    source prog_3.sql
    source prog_4.sql
    source prog_5.sql
    Ou bien, vous dupliquez la ligne "mysql" dans le script batch windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @echo off
     
    chcp 1252 > nul
     
    set PATH="C:\Program Files\MySQL\MySQL Workbench 6.3 CE";%PATH%
     
    mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_1.sql  --force  > log_1.txt
    mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_2.sql  --force  > log_2.txt
    mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_3.sql  --force  > log_3.txt
    mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_4.sql  --force  > log_4.txt
    mysql --host=localhost --user=rose --password=rose --database=base_configuration_test < prog_5.sql  --force  > log_5.txt
    pause
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #25
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Salut Artemus et merci encore
    En dirai que vous savez ou je vais ! pour l'instant je n'ai qu'un seul fichier excel à gérer dans mes tables mais par la suite j'aurai d'autres , justement je reviendrai vers cette problématique par la suite, pour pas que les nouveaux fichiers Excel viennent écraser les informations du premier fichier excel , il faudra que je réfléchissent à ça !
    Revenons à notre script ? donc pourquoi ça ne marche pas ! avez vous regarder l'erreur qu'il m'affiche ? erreur de syntaxe à la ligne Load data ...
    est ce que le
    set autocommit
    est ici juste pour activer la transaction ou bien on peut se passer et juste se contenter de mettre
    start transaction
    la même chose pour
    set autocmmit = 1
    , c'est pour dire que c'est la fin de la transaction c'est bien ça ?

    Merci pour votre réponse
    Cordialement.

  6. #26
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Coeur de Pirat.

    Avez-vous lu le lien que je vous ai donné ?

    Ceci permet de désactiver l'autocommit implicite.
    Autrement dit, en mettant zéro, c'est à vous de gérer les validations (commit) ou les rejets (rollback).

    C'est le début du mode transactionnel.
    A partir de maintenant vous journalisez toutes vos insertions, ou modifications ou suppressions.

    C'est la validation de ce qui a été journalisée.

    C'est le rejet de ce qui a été journalisée.

    On repasse dans le mode autocommit implicite.

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

  7. #27
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Bonjour Artemus 24,
    Merci pour votre réponse , toujours trés claire !
    Mon script batch fonctionne très bien avec ma base de données vide , cependant je travaille avec des données déjà enregistrés et je suis confronté à un problème de jointure
    J'ai 3 table (Model, materiel et valeurs_champs_materiels)
    pour mes inserts voici les scripts :
    Pour inserer des données dans ma table model :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT  INTO `base_configuration`.`model` (model_number,id_image,id_nature,id_manufacturer)              
    SELECT  CONCAT(Probe,'-', Housing) as model_number ,
           null as id_image,
           2 as id_nature,
           4 as id_manufacturer 
    from `base_configuration`.`traducteur_IBM`;
    la table materiel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO  `base_configuration`.`materiel` (serie, fichier,id_model)
    SELECT  DISTINCT 
    '00000' as serie ,
     NULL  as fichier ,  
     m.id_model as id_model     
    FROM   `base_configuration`.`model` m 
    where  m.id_model between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    table valeurs_champs_materiels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO  `base_configuration`.`valeurs_champs_materiels`  
        (   id_materiel
        , valeur_string
        ,   id_champ
        ,   id_type_data
         )
    SELECT  DISTINCT 
            id_materiel AS id_materiel
    	,  'capteur_mono' AS valeur_string	
        ,   4           AS id_champ
        ,   10          AS id_type_data
    FROM    base_configuration.materiel l
    where  l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    Jusqu'ici tout se passe bien , j'ai bien les bons ID_materiel dans ma table valeurs_champs_materiels
    Cependant, quand je fais cette requête pour inserer d'autres données dans la même table avec condition (prendre les mêmes id_materiel insérés précédemment , cela ne m'affiche rien)
    Voici la requête en question :
    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
    INSERT INTO  `base_configuration`.`valeurs_champs_materiels`  
       (   id_materiel
       ,   id_champ
    	, valeur_string
        , id_type_data
         )
    SELECT  DISTINCT 
            l.id_materiel AS id_materiel
        ,   12           AS id_champ
        ,  if (t.element= 'A1','Transducer.multi', 'Transducer.mono')
           as valeur_string
        ,   10        AS id_type_data
    FROM   base_configuration.traducteur_IBM t
    inner join  base_configuration.model m
    on CONCAT(probe,'-', housing)= m.model_number
    inner join base_configuration.materiel l
    on l.id_model= m.id_model
    where  l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    Cela me donne 0 lignes mais ne mentionne aucune erreur !

    Ma question: devrais-je faire une autre jointure en prenant en compte cette même table valeurs_champs_materiels et faire quelque chose qui ressemble à ça :
    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
    INSERT INTO  `base_configuration`.`valeurs_champs_materiels`  
       (   id_materiel
       ,   id_champ
    	, valeur_string
        , id_type_data
         )
    SELECT  DISTINCT 
            l.id_materiel AS id_materiel
        ,   12           AS id_champ
        ,  if (t.element= 'A1','Transducer.multi', 'Transducer.mono')
           as valeur_string
        ,   10        AS id_type_data
    FROM   base_configuration.traducteur_IBM t
    inner join  base_configuration.model m
    on CONCAT(probe,'-', housing)= m.model_number
    inner join base_configuration.materiel l
    on l.id_model= m.id_model
    inner join base_configuration.valeurs_champs_materiels v 
    ON v.id_valeurs_champs_materiel = v.id_materiel 
    where l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT())
    Merci pour votre aide
    Cordialement.

  8. #28
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    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 088
    Points : 38 384
    Points
    38 384
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si vous n'insérez aucune ligne et qu'il n'y a pas de message d'erreur, c'est que votre requête select imbriquée ne trouve aucune ligne, vérifiez le simplement en exécutant cette requête seule.

    Vous utilisez des fonctions de colonne pour alimenter ce qui ressemble à des identifants (a priori non primaires) dans vos tables , ex : CONCAT(Probe,'-', Housing) as model_number-
    Si ces colonnes sont indexées, alors votre requête n'est pas "sargable" ca signifie que vos index ne seront éligibles ni pour vos jointures, ni pour vos filtres, avec pour conséquence des performances potentiellement désastreuses selon le volume d'information à traiter.
    Il aurait été préférable d'avoir 2 colonnes distinctes pour chaque partie constitutive de votre "model number"

  9. #29
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Je vous avoue que je ne comprends pas trop ce que vous m'expliquer ! le model number c'est une concatenation de deux colonnes que j'ai cherché de la table traducteur_IBM ! c'est une exigence de mes inserts ! je vais chercher autour de ce que vous me dites , peut être que c'est ça l'erreur !
    Entre temps j'ai fait un update juste derrière mon insert comme ceci :
    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
    NSERT INTO  `base_configuration`.`valeurs_champs_materiels`  
       (   id_materiel
       ,   id_champ
    	, valeur_string
        , id_type_data
         )SELECT  DISTINCT 
            l.id_materiel AS id_materiel
        ,   12           AS id_champ
     
        ,  if (t.ProbeType= 'A1','Transducer.mono', 'Transducer.multi')
           as valeur_string
        ,   10        AS id_type_data
    FROM   base_configuration.traducteur_IBM t
    inner join  base_configuration.model m
    on CONCAT(probe,'-', housing)= m.model_number
    inner join base_configuration.materiel l
    on l.id_model= m.id_model
    where l.id_materiel between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    update valeurs_champs_materiels v 
    inner join base_configuration.materiel l
    on l.id_materiel= v.id_materiel
    set l.id_materiel= last_insert_id() and (LAST_INSERT_ID() + ROW_COUNT())
    il me sélectionne pas les lignes entières , il me donne une erreur 1175 : Vous utilisez le mode de mise à jour en toute sécurité et vous avez essayé de mettre à jour une table sans WHERE qui utilise une colonne KEY Pour désactiver le mode sans échec , basculer l'option dans les Préférences - > Editeur de SQL et rebrancher.

    Merci de votre réponse !

  10. #30
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Coeur de Pirat.

    Plusieurs conseils à te donner :

    1) essayes de faire simple, sinon gare à la maintenance !!!

    2) tu as un problème de périmètre (j'espère que tu comprends ce terme).
    Le mieux pour résoudre ce problème est de passer par une table temporaire.
    Ainsi tu travailles sur un sous-ensemble et non sur la totalité de la table.

    3) dans la table temporaire, fais la mise en forme dont tu as besoin avant de faire ton insertion.
    Cela va te simplifier grandement le travail que tu dois faire.

    4) tu as trouvé une astuce qui me parrait inutile, mais surtout compliquée à souhait.
    C'est le where m.id_model between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());.
    D'ailleurs, tu l'utilises dans tes insert alors qu'en travaillant sur les tables temporaires, tu n'as plus besoin de cette astuce.

    Voici un exemple qui permet de faire l'insert définitif, sans avoir de problèmes à gérer.
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `temp`
    --------------
     
    --------------
    CREATE TABLE `temp`
    (
      `clef` integer unsigned auto_increment NOT NULL primary key,
      `lib`  varchar(255)                    NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (
      `id`      integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `val`     varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`val`) values
      ('un'), ('deux'), ('trois'), ('quatre'), ('cinq')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+--------+
    | id | val    |
    +----+--------+
    |  1 | un     |
    |  2 | deux   |
    |  3 | trois  |
    |  4 | quatre |
    |  5 | cinq   |
    +----+--------+
    --------------
    set @rang:=0
    --------------
     
    --------------
    SELECT AUTO_INCREMENT into @rang
    FROM INFORMATION_SCHEMA.TABLES
    WHERE table_schema = 'base' and table_name = 'test'
    --------------
     
    --------------
    select @rang
    --------------
     
    +-------+
    | @rang |
    +-------+
    |     6 |
    +-------+
    --------------
    set @var = concat('alter table `temp` auto_increment = ', @rang)
    --------------
     
    --------------
    PREPARE stmt FROM @var
    --------------
     
    --------------
    EXECUTE stmt
    --------------
     
    --------------
    DEALLOCATE PREPARE stmt
    --------------
     
    --------------
    INSERT INTO `temp` (`lib`) values
      ('dix'), ('onze'), ('douze'), ('treize'), ('quatorze'), ('quinze'), ('seize')
    --------------
     
    --------------
    select * from temp
    --------------
     
    +------+----------+
    | clef | lib      |
    +------+----------+
    |    6 | dix      |
    |    7 | onze     |
    |    8 | douze    |
    |    9 | treize   |
    |   10 | quatorze |
    |   11 | quinze   |
    |   12 | seize    |
    +------+----------+
    --------------
    insert into `test` (`id`,`val`)
    select clef as id,
           lib  as val
    from `temp`
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+----------+
    | id | val      |
    +----+----------+
    |  1 | un       |
    |  2 | deux     |
    |  3 | trois    |
    |  4 | quatre   |
    |  5 | cinq     |
    |  6 | dix      |
    |  7 | onze     |
    |  8 | douze    |
    |  9 | treize   |
    | 10 | quatorze |
    | 11 | quinze   |
    | 12 | seize    |
    +----+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Il y a deux tables :
    --> 'test', celle que tu dois charger avec un jeu d'essai.
    --> 'temp', la table de travail dont tu dois mettre en forme.

    a) dans la table 'test', il y a déjà un jeu d'essai, soit cinq lignes.
    tu désires récupérer la dernière valeur de l'auto incrément afin de l'appliquer à la table 'temp'.
    Bien sûr, la table 'temp' est vide puisque c'est une table de travail.

    b) tu extrais la valeur de l'auto incrément de la table 'test', qui comme tu le constates est la dernière valeur de la colonne 'id' +1.

    c) tu appliques cette nouvelle valeur de l'auto incrément à la table 'temp'.

    d) tu insères les nouvelles lignes dans la table 'temp'.
    En ce point de ton travailles, la table 'temp' a été mis en forme pour la suite de ce que tu dois faire.
    Je ne parle pas que de l'insert, mais aussi des cascades que tu dois faites par la suite comme dans tes exemples.

    e) tu disposes tout ce dont tu as besoin, entre autre un identifiant 'clef' qui possède les prochaines valeurs à insérer dans la table 'test'.
    J'espère que quand tu vas lancer ce script, tu es seule à le faire !!!

    f) tu insères les nouvelles lignes de 'temp' dans la table 'test' sans aucun problème, comme tu peux le constater.

    g) je m'arrête là, mais j'espère que tu as compris comment tu dois procéder pour faire en cascade les différents chargement de test tables.
    Il suffit de faire une jointure sur la table 'temp' et c'est tout !
    Du coup, tu n'as plus aucun problème pour trouver les identifiants dont tu as besoin.

    h) plus tu simplifies le travail dès le départ et mon tu vas rencontrer des problèmes par la suite !

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

  11. #31
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut Probléme de requête sql
    Bonjour Artemus 24,
    je suis confronté à un problème de requête, je n'arrive pas à associer pour chaque modéle une image !
    voici mes deux tables ainsi que ma table de travail :
    table de travail:
    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
    CREATE TABLE IF NOT EXISTS base.trad(
     base.trad.id INT(11) NOT NULL AUTO_INCREMENT,
     base.trad.name VARCHAR(45) NULL DEFAULT NULL, 
     base.trad.Model_Number VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Serial_Number VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Pattern VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Type VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Element VARCHAR(45) NULL DEFAULT NULL,
     base.trad.NumberofElementsTotal VARCHAR(45) NULL DEFAULT NULL,
     base.trad.NumberofElementsDimB VARCHAR(45) NULL DEFAULT NULL,
     base.trad.ElementDimB VARCHAR(45) NULL DEFAULT NULL,
     base.trad.ElementDimA DOUBLE NULL DEFAULT NULL,
     base.trad.ElementPitchA VARCHAR(45) NULL DEFAULT NULL,
     base.trad.ElementPitchB VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Element_position VARCHAR(45) NULL DEFAULT NULL,
     base.trad.surface VARCHAR(45) NULL DEFAULT NULL,
     base.trad.surface_type VARCHAR(45) NULL DEFAULT NULL,
     base.trad.surfaceparameters VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Nominal_Frequency VARCHAR(45) NULL DEFAULT NULL,
     base.trad.Picture BLOB NULL DEFAULT NULL,
     base.trad.Description VARCHAR(45) NULL DEFAULT NULL,
     base.trad.capteur_inclut VARCHAR(45) NULL DEFAULT NULL,
    PRIMARY KEY (id))
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
    import du fichier Excel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    LOAD DATA LOCAL INFILE 'C:\\Stage\\Essai.csv'
    INTO TABLE base.trad
    CHARACTER SET utf8
    FIELDS TERMINATED BY ';'
    ENCLOSED BY '"'
    ESCAPED BY '\\' LINES
    TERMINATED BY '\r\n'
    IGNORE 1 LINES;
    insertion d'une image dans la table image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into base.image(image, nom_image)
    select t.picture as image,
    	'B2M' as nom_image
      from base.trad t;
    la table model :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    insert into base.model(model_number, description, id_nature,id_manufacturer, id_image)
    select distinct
    t.Model_number as model_number,
    t.description as description,
    (select id_nature from base.nature where id_nature= 2) as id_nature,
    (select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer,
    (select id_image from base.image where nom_image='B2M' ) as id_image
    from base.trad t
    inner join base_configuration.image i
    ON i.image = t.picture
    where  i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    Résultat :
    Il m'affiche pour chaque model, il m'associe tout les id_image or moi je veux pour chaque model un id_image !
    Merci de votre aide
    cordialement,

  12. #32
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Coeur de Pirat.

    Tu fais n'importe quoi ! Et en plus, tu t'y prends très mal.

    J'ai surtout l'impression que tu ne sais pas comment répartir les données issues du fichier Excel vers tes tables MySql.
    Il n'y a aucun reflexion sur le passage du fichier Excel vers tes tables MySql.

    Si tu éclates un fichier en plusieurs tables, tu dois conserver sous une forme ou une autre, le lien qui existe entre ces données.
    Sinon comment associer par exemple une image venant de ta table trad, vers la table modèle ?

    Ce n'est pas du simple recopiage de masse que tu dois faire, mais bien créer des liens.

    Si la première chose à faire est de charger le fichier Excel dans une table de travail, ça tu sais le faire.
    Faire l'éclatement des lignes vers des tables, ne se fait pas en faisant que du recopiage.
    Si tu procédes ainsi, tu as une perte d'informations qui est celle du lien entre tes données.
    Ce lien se fait par la clef primaire de ta table, mais aussi par les clefs étrangères que tu dois aussi gérer dans les autres tables.

    1) tu remplies la table image en mettant toujours le même nom. Comment veux-tu distinguer une image d'une autre ?
    Je ne voie pas, dans la table image, le descriptif de cette image ?
    Pourtant, tu as cette colonne dans la table trad. Alors pourquoi ne pas la reconduire ?

    Et quel est l'identifiant de cette image ?
    Ce n'est pas par le nom de l'image que tu dois faire le lien, mais par son identifiant.

    2) dans le dernier insert, il faut créer des jointures entre toutes tes tables.
    Tu as créé une jointure avec la table base_configuration. Et pourquoi ne pas le faire avec les autres tables ?

    Et c'est quoi le problème ? Tu ne sais pas faire le lien entre toutes ces tables.
    C'est le coeur même de ce que l'on te demande de faire.

    3) c'est quoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_nature from base.nature where id_nature= 2) as id_nature,
    Pourquoi le faire ainsi et non dans le cadre d'une jointure ?
    Pourquoi mettre toujours id_nature à 2 ?

    Si la colonne id_nature est ta clef primaire, comment la gères-tu ?
    Et comment vas-tu faire le lien entre la table trad ?

    4) même remarque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer,
    Faire une jointure !
    Donc tu as qu'une seule image dans toutes ta base de données. Est-ce bien cela ?

    5) encore et toujours les mêmes remarques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (select id_image from base.image where nom_image='B2M' ) as id_image
    Une seule image ?????

    6) je t'ai montré comment faire et tu reviens avec cette merde !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where  i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    Désolé mais ce n'est pas à moi de faire ton projet.
    Je t'ai aidée sur des questions techniques, et je m'arrête là.

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

  13. #33
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Oullaa doucement Artemus !
    C'est bien gentil de m'aider mais la j'avoue que tu me surprend!
    Certes je me suis mal exprimé et j'ai fait quelques erreurs das le code en le recopiant dans le forum !
    1) Je n'ai qu'une seule image par défault dans mon fichier excel et donc j'ai rempli la table image normalement depuis la table trad .
    2) La base_configuration est une erreur de ma part, je voulais dire base.image, j'ai fait le lien entre la table trad et la table image et le seul lien qui existe c'est bien la colonne picture et la colonne image.
    3) ceci est une erreur en recopiant le code !
    select id_nature from base.nature where id_nature= 2
    , je récupere l'id donc je mets where nature = 'Traducteur'.
    4) Meme chose pour cette requete :
    select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer,
    , ici je récupére l'id manufacturer.
    Oui c'est ça j'ai qu'une seule image que j'applique pour toutes les lignes (Tout les model_number).
    5) Merci bien pour toute l'aide que tu m'as porté mais la ce n'est pas une merde !!!!!
    where i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT());
    Je lui dit de prendre en compte tout les derniers id_image que je venais d'insérer .
    effectivement j'ai mal recopier mes scripts et je m'en excuse , c'était totalement mélangé dans ma tête!!
    voila le bon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    insert into base.model(model_number, description, id_nature,id_manufacturer, id_image)
    select distinct
    t.Model_number as model_number,
    t.description as description,
    (select id_nature from base.nature where nature= 'transducer') as id_nature,
    (select id_manufacturer from base.manufacturer where name= 'B2M') as id_manufacturer,
    i.id_image as id_image
    from base.trad t
    inner join base_configuration.image i
    ON i.image = t.picture
    where  i.id_image between LAST_INSERT_ID() and (LAST_INSERT_ID() + ROW_COUNT())
    En tout as merci quand même du temps que t'as pris pour lire et donner des remarques !
    Je ne veux qu'apprendre et je ne compte pas demander à quiconque de me faire mon travail ! j'étais vraiment bloqué depuis quelques jours autrement je ne ferai pas appel à vous!!!

Discussions similaires

  1. Migration d'une base de données Excel vers MySQL
    Par geek.sons dans le forum MySQL
    Réponses: 5
    Dernier message: 04/11/2014, 18h58
  2. Importer des données d'Excel vers MySql
    Par philippe72 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/06/2009, 13h40
  3. transfert de donnés de excel vers Mysql
    Par mkachekh dans le forum Outils
    Réponses: 4
    Dernier message: 20/10/2006, 13h08
  4. Extraire une Base de donnée Excel vers Mysql ??
    Par Arvulis dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/01/2006, 23h58
  5. [Excel] Exportation de donnée excel vers MySQL
    Par yoda7666 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 17/11/2005, 17h18

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