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 :

Comment éviter les doubles entrées dans une base de données ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Comment éviter les doubles entrées dans une base de données ?
    Bonjour,

    On essaye d'importer dans une base de données, le contenu d'un fichier .csv , comment faire pour éviter d'importer des entrées similaires ?

    sachant que le fichier csv contient un unique numéro qu'on peut utiliser.


    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme je l'ai dit dans cette autre réponse que je t'ai faite hier soir :
    D'une manière générale d'ailleurs, il vaut mieux importer le fichier CSV dans une table temporaire puis répartir les données comme il se doit dans une BDD structurée et normalisée avec les bons types de colonnes.
    Il va vraiment falloir que je l'écrive cet article sur l'importation des données de fichiers csv !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut


    tu as tout à fait raison CinePhil, en attendant l'article , est ce que c'est possible de m'aider ?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si tu expliques mieux ton besoin, oui.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    l'ajout du contenu d'un fichier csv à la base de donnée , sans avoir de double , parcequ'on compte utiliser cronjob pour effectuer automatiquement l'opération.


    exemple du csv:

    "header1","header2","header3","tite_du_code_unique","header4","header5"
    "text1" ,"text2" ,"text3" ,"code" ,"text4" ,"text5"
    "text11" ,"text12" ,"text13" ,"code1" ,"text14" ,"text15"
    il nous faut un moyen pour n'ajouter que les nouveaux entrées en se basant sur le code unique.


    Merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu veux ajouter des données dans une table existante en évitant de ré-insérer les lignes dont le code existe déjà dans la table ?

    Doc MySQL :
    Les mots réservés REPLACE et IGNORE contrôlent la méthode d'insertion de lignes lorsque des doublons apparaissent pour les clés uniques.
    Si vous spécifiez REPLACE, les nouvelles lignes remplaceront les anciennes. See Section 13.1.6, « Syntaxe de REPLACE ».
    Si vous spécifiez IGNORE, les nouvelles lignes seront ignorées. Si vous ne spécifiez pas cette option, une erreur sera générée à chaque doublon, et le reste du fichier sera ignoré.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    oui c'est cela.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme j'ai édité mon précédent message pendant ta réponse, regarde ce que j'ai ajouté, cela te suffira peut-être.

    Sinon, comme je le préconise, importe le fichier csv dans une nouvelle table temporaire puis importe les données utiles dans la vraie table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO la_vraie_table (les_colonnes)
    SELECT les_colonnes_correspondantes 
    -- éventuellement avec des opérations de conversion vers les bons types de données
    FROM la_table_temporaire
    WHERE le_code_unique NOT IN(
      SELECT le_code_unique
      FROM la_vraie_table
    )
    Tu auras peut être besoin d'isoler les codes uniques existant dans une table temporaire car MySQL n'aime pas que la table en cours de modif soit dans une sous-requête.

    Ça fait longtemps que je n'ai plus fait ça alors je ne me souviens plus de la méthode exacte mais c'est l'idée. Je peaufinerai ça quand j'écrirai mon article.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Pourquoi ne pas simplement mettre une contrainte d'unicité sur le code en question et déverser les données dans la table ? Les lignes violant la contrainte d'unicité ne seront pas ajoutées.

    (Trop) simple mais ça devrait répondre au besoin.

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Oui, c'est ce que je suggérais avec l'encadré issu de la doc MySQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    oui mais comment réaliser la contrainte d'unicité sur le code ?

    j'utilise ce fichier pour ajouter le contenu csv à la base de donnée.

    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
     
    <?php
    /********************************/
    /* Code at http://legend.ws/blog/tips-tricks/csv-php-mysql-import/
    /* Edit the entries below to reflect the appropriate values
    /********************************/
    $databasehost = "";
    $databasename = "";
    $databasetable = "data";
    $databaseusername ="";
    $databasepassword = "";
    $fieldseparator = ",";
    $lineseparator = "\n";
    $csvfile = "data.csv";
    /********************************/
    /* Would you like to add an ampty field at the beginning of these records?
    /* This is useful if you have a table with the first field being an auto_increment integer
    /* and the csv file does not have such as empty field before the records.
    /* Set 1 for yes and 0 for no. ATTENTION: don't set to 1 if you are not sure.
    /* This can dump data in the wrong fields if this extra field does not exist in the table
    /********************************/
    $addauto = 0;
    /********************************/
    /* Would you like to save the mysql queries in a file? If yes set $save to 1.
    /* Permission on the file should be set to 777. Either upload a sample file through ftp and
    /* change the permissions, or execute at the prompt: touch output.sql && chmod 777 output.sql
    /********************************/
    $save = 1;
    $outputfile = "data.sql";
    /********************************/
    if(!file_exists($csvfile)) {
    	echo "File not found. Make sure you specified the correct path.\n";
    	exit;
    }
    $file = fopen($csvfile,"r");
    if(!$file) {
    	echo "Error opening data file.\n";
    	exit;
    }
    $size = filesize($csvfile);
    if(!$size) {
    	echo "File is empty.\n";
    	exit;
    }
    $csvcontent = fread($file,$size);
    fclose($file);
    $con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
    @mysql_select_db($databasename) or die(mysql_error());
    $lines = 0;
    $queries = "";
    $linearray = array();
    foreach(split($lineseparator,$csvcontent) as $line) {
    	$lines++;
    	$line = trim($line," \t");
    	$line = str_replace("\r","",$line);
    	/************************************
    	This line escapes the special character. remove it if entries are already escaped in the csv file
    	************************************/
    	$line = str_replace("'","\'",$line);
    	/*************************************/
    	$linearray = explode($fieldseparator,$line);
    	$linemysql = implode(",",$linearray);
    	if( $lines > 1) {
    	if($addauto)
    		$query = "insert into $databasetable values('','$linemysql');";
    	else
    		$query = "insert into $databasetable values($linemysql);";
    	$queries .= $query . "\n";
    	@mysql_query($query);
    }
    }
    @mysql_close($con);
    if($save) {
    	/*if(!is_writable($outputfile)) {
    		echo "File is not writable, check permissions.\n";
    	}
    	else {*/
    		$file2 = fopen($outputfile,"w");
    		if(!$file2) {
    			echo "Error writing to the output file.\n";
    		}
    		else {
    			fwrite($file2,$queries);
    			fclose($file2);
    		}
    	//}
    }
    echo "Found a total of $lines records in this csv file.\n";
    ?>

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je croyais que tu utilisais simplement LOAD DATA INFILE pour importer le fichier csv !

    La contrainte d'unicité se pose sur la table dans MySQL par l'ajout d'un index de type UNIQUE, à moins que celui n'existe déjà.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    j'ai essayé de recréer la table en ajoutant

    UNIQUE code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `data` (
      `header1` text NOT NULL,
      `header2` text NOT NULL,
      `header3` text NOT NULL,
      `tite_du_code_unique` text NOT NULL,
      `header4` text NOT NULL,
      `header5` text NOT NULL
       UNIQUE (tite_du_code_unique)
    ) ENGINE=MyISAM;
    mais ça marche pas

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par grazianno Voir le message
    mais ça marche pas
    Et comme j'ai une boule de cristal sur mon bureau, je vois tout de suite quels symptômes font que "ça marche pas" !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    aucune idée

    je crois que je vais essayer distinct dans select.

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

Discussions similaires

  1. Comment déterminer les champs modifiés dans une base
    Par Casual dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2007, 08h33
  2. Réponses: 4
    Dernier message: 23/04/2007, 12h01
  3. Dernière entrée dans une base de données
    Par ploxien dans le forum JDBC
    Réponses: 1
    Dernier message: 10/05/2006, 14h30
  4. [MySQL] Suppresion d'une entrée dans une base de donnée.
    Par bullrot dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/03/2006, 19h33
  5. Réponses: 1
    Dernier message: 23/10/2005, 00h55

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