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 :

PHP & MySQL : éviter les doublons dans la table.


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut PHP & MySQL : éviter les doublons dans la table.
    Bonjour,
    J'ai un soucis avec un script d'ajout d'entrées en masse dans une table MySQL.
    1° Le script génères les informations dans un tableau (array). Et supprime les doublons à l'intérieur de ce tableau (array_unique()). D'une autre part, j'ai une table MySQL prête à accueillir ces données, elle aussi est nette de doublons.
    2° Une boucle ajoute chaque éléments du tableau dans la table de la base de données.
    3° C'est là que je coince. Comment vérifier que l'info du tableau n'est pas déjà dans la bdd ?

    J'ai quelques pistes et idées :
    - utilisation de la requête REPLACE INTO, avec l'utilisation d'une clef UNIQUE. C'est la solution qui m'a semblé la plus adaptée à mon problème.
    - copie intégrale de la table (et puis la vider intégralement) et placer les info dans un array, ensuite coupler les deux array (celle générée par le script + copie de la table) et supprimer les doublons possibles avec array_unique() ensuite remettre tout dans la base de données. Mais ça va horriblement ralentir la vitesse d'exécution, donc l'idée n'est pas bonne.

    Pour info et une meilleur compréhension :

    Liste (array créer par le script)
    ---------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    $liste=array([0] => "donnée 6381",
                 [1] => "donnée 7256",
                 [2] => "donnée 0692",
                 [3] => "donnée 1829",
                 [4] => "donnée 3044",
                 [5] => "donnée 9670");
    // Cette liste ne contient pas de doublons
    ?>
    Tableau d'une base MySQL
    -----------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ID | donnee      | date  | ..... |
    -----------------------------------------
    0    donnée 1235   YYYY    .....
    1    donnée 0987   YYYY    .....
    2    donnée 3456   YYYY    .....
    3    donnée 9670   YYYY    .....
    4    donnée 2345   YYYY    .....
    5    donnée 4321   YYYY    .....
    6    donnée 9854   YYYY    .....
    7    donnée 6798   YYYY    .....
    8    donnée 5463   YYYY    .....
    9    donnée 6574   YYYY    .....
    // Cette liste est également saine de doublons.
    Maintenant, si j'ajoute touts les éléments de la liste à la suite, les entrées d'ID 3 et 15 seront des doubles de part leur champ 'donnee' . Voilà un exemple concret de ce que je voudrait éviter.

    Merci à ceux et celles qui pourront m'aider, j'espère que j'ai été assez clair dans les explications

  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
    Regarde du côté de INSERT IGNORE INTO avec un index UNIQUE sur ta colonne de données.
    Citation Envoyé par Documentation MySQL
    • Si on spécifie le mot IGNORE dans un INSERT avec les valeurs de plusieurs lignes, chaque ligne qui qui ferait doublon avec une clé PRIMARY ou UNIQUE existante dans la table sera ignoré et ne sera pas insérée. Si on ne spécifie pas IGNORE, l'insertion est abandonnée si quelque ligne que ce soit fait doublon avec une clé existante. La fonction mysql_info() de l'API C permet de savoir combien de lignes ont été insérées dans la table.

    Si vous spécifiez la clause ON DUPLICATE KEY UPDATE (nouveau en MySQL 4.1.0), et qu'une ligne insérée engendre un doublon pour une clé PRIMARY ou UNIQUE, une commande UPDATE sera faite à la place de l'insertion.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Oulaaa ...

    Tu pourrais me donner un exemple d'utilisation parce que j'ai pas vraiment compris

    D'un autre côté, quelqu'un m'a conseillé d'utiliser INSERT ON DUPLICATE mais encore une fois je me plante sur le code, voilà a quoi je suis arrivé en essayant de suivre l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach ($list as $data)
    {
    mysql_query("insert into table (id,donnees,autre) values ('','$data','blabla') on duplicate key update donnees = donnees;" );
    }
    Evidement il ne marche pas

  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
    Tu commences par mettre un index UNIQUE sur la colonne Donnee :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX DonneeUnique ON taTable(Donnee)
    Ensuite tu essaies d'insérer les données avec INSERT IGNORE INTO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT IGNORE INTO taTable(Donnee)
    VALUES('1235', '0987', '3456', '9670'...)
    Si ces données existent déjà, elles ne devraient pas être insérées à cause de l'index UNIQUE et de l'instruction IGNORE, si j'en crois la doc MySQL.

    A adapter à ton cas.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Ouf !

    Ca marche enfin !

    Merci beaucoup !

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

Discussions similaires

  1. Comment éviter les doublons dans une ComboBox
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 27/07/2017, 16h03
  2. Éviter les doublons dans une table
    Par ifr38 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 29/05/2014, 15h03
  3. problème pour éviter les doublons dans une table
    Par bonnet85 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/02/2008, 04h35
  4. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18
  5. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37

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