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 :

Chargement de données dans table mysql


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut Chargement de données dans table mysql
    Bonjour,

    j'ai un petit souci: je charge dans une table des valeurs toutes les trentes minutes à partir d'un fichier txt.J'utilise donc la fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LOAD DATA INFILE 'C:\\wamp\\mysql\\data\\stage\\data\\capteurs.txt' 
    INTO TABLE testtable_captor(id_captor,name,present);
    Mon problème est qu'au bout d'une demi heure,lorsque je veut recharger le fichier txt avec des nouvelles valeurs supplémentaires, il me met en double les valeurs du premier chargement.. Et je n'arrive pas à enlever ce problème de doublons..J'ai bien pensé à IGNORE, mais je ne suis pas sur qu'il fonctionne dans mon cas, où alors je n'arrive pas à l'utiliser. Et je ne veux pas faire un DROP testtable_captor. Il est nécessaire que je n'ajoute que les valeurs qui n'ont pas été au préalable chargées.. Merci pour voitre aide

  2. #2
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Citation Envoyé par patsak Voir le message
    J'ai bien pensé à IGNORE, mais je ne suis pas sur qu'il fonctionne dans mon cas, où alors je n'arrive pas à l'utiliser.
    Bonjour,

    Comme ça peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LOAD DATA INFILE 'C:\\wamp\\mysql\\data\\stage\\data\\capteurs.txt' 
    IGNORE INTO TABLE testtable_captor(id_captor,name,present);
    ced
    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

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Merci pour ta réponse ultra rapide!!lol

    C'est exactement ce que j'avais testé avec ignore, mais ça ne fonctionne pas. Ca serrait tellement plus simple!!

  4. #4
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Comment est définie la table testtable_captor ?
    Quelle est sa clef primaire et le type de cette colonne ?

    ced
    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

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    j'avais hésité à donner la structure dès le premier message..je la donne alors!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE IF NOT EXISTS testtable_captor (
    	id_captor TINYINT UNSIGNED NOT NULL PRIMARY KEY,	/*Autofill ID*/		/*256*/
    	name VARCHAR(10) NOT NULL,
    	present BOOLEAN
    	) ENGINE = innodb COMMENT = 'Table des n° de tous les capteurs';
    En réalité j'ai le problème pour plusieurs tables, mais je pense que ça sera le même principe pour toutes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE IF NOT EXISTS testtable_data_temperature (
    	id_time MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,	/* 0 à 16 777 215*/
    	datetime DATETIME NOT NULL,
    	temperature1 TINYINT UNSIGNED ,	/*0 to 255*/
    	temperature2 TINYINT UNSIGNED)

  6. #6
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Mis à part qu'il me refuse la syntaxe en laissant le nom des colonnes (il faut juste laisser le nom de la table) derrière le nom de la table dans le LOAD DATA INFILE, ça marche chez moi...
    Quelle est la structure du fichier texte (séparateur entre champs, séparateur entre lignes) ?

    Pour les autres tables, attention tout de même aux champs clé auto-incrémentés...

    ced
    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

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Avec exactement ça ça marche chez toi??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE IF NOT EXISTS testtable_captor (
    	id_captor TINYINT UNSIGNED NOT NULL PRIMARY KEY,	/*Autofill ID*/		/*256*/
    	name VARCHAR(10) NOT NULL,
    	present BOOLEAN
    	) ENGINE = innodb COMMENT = 'Table des n° de tous les capteurs';
     
     
    LOAD DATA INFILE 'C:\\wamp\\mysql\\data\\stage\\data\\capteurs.txt' 
    IGNORE INTO TABLE testtable_captor(id_captor,name,present);
     
     
     
    SELECT * FROM testtable_captor;	/*affichage table*/
    Pour ce qui est des séparateurs, pour la table captor les champs sont séparés par des tabulations, retour à la ligne ensuite entre les différentes lignes.
    Pour les autres tables c'est un peu plus compliqué..
    date suivi de tabulation puis time puis que des espaces entre les valeurs.. Mais pour le moment j'aimerais trouvé comment faire fonctionner la table captor.. Je ne vois pas pourquoi ça ne marche pas chez moi, mais chez toi si!!

  8. #8
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    En version MySQL 5.0.41, oui ça marche. Il ne m'ajoute aucun doublon.
    J'ai créé un fichier .txt avec la tabulation comme séparateur et j'ai repris ta syntaxe de création de table.

    Je n'ai pas de problème de doublons...

    ced
    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

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Attend excuse moi en fait ça à l'air de marcher pour la table_captor mais pas les suivantes..je regarde je te redis..que tu cherches pas dans le vent!!Merci

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Ok donc ça marche bien pour la table_captor, mais pas pour les deux autres. Elles ont la même structure et le même code, donc je ne t'envois qu'une:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE IF NOT EXISTS testtable_data_temperature (
    	id_time MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,	/* 0 à 16 777 215*/
    	datetime DATETIME NOT NULL,
    	temperature1 TINYINT UNSIGNED ,	/*0 to 255*/
    	temperature2 TINYINT UNSIGNED,
                 ....)
     
    LOAD DATA INFILE 'C:\\wamp\\mysql\\data\\stage\\data\\creation_data_temperature' 
    IGNORE
    INTO TABLE testtable_data_temperature
    FIELDS TERMINATED BY ' '
    ENCLOSED BY ''
    (datetime,temperature1,temperature2,...);
    Donc comme je te disais les champs sont tous séparés par des espaces (il y a juste une tabulation entre la date et le temps pour la valeur datetime). Encore désolé pour le problème de doublon qui n'était pas sur la bonne table..

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Ok je vois le problème..avec le auto increment... Mais j'ai besoin de cet id pour lier les deux tables..COmment faire?

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    J'ai pensé à quelque chose: récupérer la valeur de l'auto incrément puis ignorer ensuite les lignes inférieures à cette valeur..mais je n'arrive pas à le programmer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    LOAD DATA INFILE 'C:\\wamp\\mysql\\data\\stage\\data\\creation_data_temperature' 
    INTO TABLE testtable_data_temperature
    FIELDS TERMINATED BY ' '
    ENCLOSED BY ''
    (datetime,temperature1,temperature2,temperature3,temperature4,...)
    IGNORE LINES< 'a';
     
    SELECT COUNT(*) FROM testtable_data_temperature;
    a=fetch_row(COUNT(*) FROM testtable_data_temperature);
    Bon je sais bien que ça ne marche pas, que la je fais même un peu de la merde!!lol . Mais ici c'est la fin de la journée et j'ai plus du tout les idées claires!! Si quelqu'un peut m'aider pour que je boucle ça rapidos.Merci beaucoup!!

  13. #13
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Tu veux une seule ligne par date, c'est ça ?

    Pourquoi ne pas mettre un index UNIQUE sur datetime (au passage, c'est pas très bien de nommer un champ avec un mot-clef, surtout qui correspond à un type de colonne).
    Si datetime est unique, MySQL va ignorer les insertions dessus... Enfin, je pense (j'ai jamais testé ).

    ced
    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

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    OUi je veux une ligne par date.. C'est vrai que j'ai pas fait gaf pour le datetime.. Tu voudrais que je supprime en gros mon id_time? Je m'en servais pour savoir combien d'enregistrements je faisais, et pour faire mes liens entre table, c'est parait plus évident qu'un datetime, même si maintenant je comprends que c'est le même principe. Désolé je débute en fait en sql donc je galère un peu.. Mais ça vient..

  15. #15
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Citation Envoyé par patsak Voir le message
    Tu voudrais que je supprime en gros mon id_time?
    Non pas forcément, mais il faut à MySQL une contrainte d'unicité pour détecter si il y a un doublon ou pas. Or, avec l'auto incrément, tu le laisses, à chaque insertion, créer un identifiant unique (et donc tu as des doublons)...
    Mais tu peux, dans une table, définir une contrainte d'unicité sur un autre champ (ajoute une contrainte UNIQUE sur le champ en question, pour empêcher les doublons dessus).
    Donc, si tu mets une contraintes UNIQUE sur datetime, tu peux garder l'id auto-incrémenté, mais il n'y aura pas 2 enregistrements avec le même datetime (bref, tu gardes le beurre et l'argent du beurre ).

    Citation Envoyé par patsak Voir le message
    Désolé je débute en fait en sql donc je galère un peu.. Mais ça vient..
    On est là pour ça : t'aider à progresser .

    ced
    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

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Suivant tes conseils j'ai mis UNIQUE pour chacun des datetime des deux tables, mais le problème c'est que je ne te l'ai pas dit les mesures sont faites exactement en même temps, ce qui fait que pour la deuxieme table on a une valeur en moins..logique mais pas terrible..

    Mais le pire c'est qu'ensuite je réunis ces deux tables dans une plus grande, en les reliant avec les id_time..et là ça me mets des NULL partout (même si je n'ai pas mis de UNIQUE pour cette table là)..

    Donc la solution du UNIQUE marcherait bien si les dates étaient différentes mais là ça me parait compliqué.. Comment faire? Mon idée de récupérer le nombre de id dans la table pour supprimer ensuite les valeurs déjà présentes ne pourrait elle pas marcher??

  17. #17
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Ouh là... Je ne comprends plus rien .
    Si les 2 tables ont toutes les deux des champs datetime (avec éventuellement la même date dans les données), je ne vois pas comment le fait de mettre UNIQUE sur l'une bloque l'autre... Comment fais-tu l'import de données, avec 1 ou 2 LOAD DATA INFILE ?

    Bref, je suis un peu perdu... Un petit exemple ?

    ced
    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

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Autant pour moi en regardant mes fichiers de données, je me suis rendu compte que j'avais une ligne en plus dans un des fichiers.. Maintenant je dois retrouver laquelle!!lol

    Je te retiens au courant si ça marche.. Merci et désolé de te poser des problèmes qu'en il n'y en a pas!!lol

  19. #19
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    Bon ça avance.. ça à l'air de marcher pour les trois tables, reste la table où je récupère les id_time poour joindre les tables.. Là j'ai toujours le problème de doublon... j'ai essayé de placer un UNIQUE comme auparavant mais dans ce cas là je n'ai plus rien dans ma table! Ma structure de table est la suivante, avec la methode de chargement:
    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
    CREATE TABLE IF NOT EXISTS testtable_data (
    	id_time INTEGER REFERENCES test_table_captor(id_time),
    	datetime DATETIME NOT NULL,
    	id_captor INTEGER REFERENCES test_table_captor(id_captor),
    	name VARCHAR(10) NOT NULL,
    	present BOOLEAN,
    	temperature TINYINT UNSIGNED,
    	voltage SMALLINT
    	) ENGINE = innodb COMMENT = 'Table with all temperature';
     
     
    INSERT INTO testtable_data(id_time,datetime,id_captor,name,present)
    SELECT DISTINCT id_time,datetime,id_captor,name,present
    FROM testtable_captor, testtable_data_temperature
    ORDER BY id_time,id_captor;
     
    UPDATE testtable_data
    SET temperature = (SELECT temperature1 FROM testtable_data_temperature WHERE testtable_data.datetime=testtable_data_temperature.datetime),
    voltage = (SELECT voltage1 FROM testtable_data_voltage WHERE testtable_data.datetime=testtable_data_voltage.datetime)
    WHERE id_captor=1
    AND datetime=(SELECT datetime FROM testtable_data_temperature WHERE testtable_data.datetime=testtable_data_temperature.datetime);
    Je continue de chercher...

  20. #20
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 91
    Par défaut
    En postant le message précédent j'ai remarqué que j'avais fait une erreur, que je n'avais pas remarqué car mysql ne me disait pas d'erreur je ne sais pas pourquoi! Il n'y a pas de champ datetime dans testtable_captor. J'ai donc changé et mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id_time INTEGER REFERENCES test_table_temperature(id_time),
    datetime DATETIME UNIQUE NOT NULL,
    Mais j'ai toujours le même problème..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MySQL] Suppression récurrente de données dans tables MySQL
    Par macgyver44 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/11/2014, 13h07
  2. CSV fichiers et chargement des données dans une table
    Par Lolitaaa dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2010, 16h21
  3. insertion de données dans table mySQL
    Par kumo dans le forum ASP
    Réponses: 13
    Dernier message: 18/12/2007, 22h34
  4. [MySQL] Problème insertion de données dans table Mysql
    Par Malcolm78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/10/2007, 18h25
  5. [MySQL] envoi des données de boutons radio dans table mysql
    Par alexbigot dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 07/06/2007, 14h51

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