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 :

[Doublons] Unicité sur un champ de type TEXT


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut [Doublons] Unicité sur un champ de type TEXT
    Salut,

    j'ai une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `blagues` (
      `id` int(11) NOT NULL auto_increment,
      `cat` varchar(50) NOT NULL default 'Divers',
      `blague` text NOT NULL,
      PRIMARY KEY  (`id`)
    )
    Après insertion, je me retrouve avec environ 1200 enregistrements ce qui rend le travail infaisable à la main.

    Mon problème est de gérer...les doublons.
    Question récurrente, j'ai pourtant lu les posts à ce sujet, SQLPro...

    Ce sont des doublons relatifs (seul le champ blague ou cat diffère).

    D'après le site SQLPro, il faudrait déjà que j'ajoute une contrainte d'unicité sur le champ blague or cela m'est impossible :

    Citation Envoyé par mySQL
    #1170 - BLOB column 'blague' used in key specification without a key length
    Si j'ai bien compris, je ne peux pas car la taille de ce champ est variable ?

    Que me proposez-vous pour éliminer ces doublons ?

    Merci

  2. #2
    Membre habitué Avatar de Kimael
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Points : 159
    Points
    159
    Par défaut
    Tu génères le MD5 des Blob que tu stocks dans une colonne
    et tu vérifies qu'il n'y as pas deux sommes MD5 identiques...
    Y'a peu de chance qu'il y ait deux sommes MD5 identiques
    pour deux fichiers différents
    et une somme MD5 fait toujours la même taille.

    Enfin, c'est juste une idée
    et ça doit marcher pareil avec du MD4...
    (qui a dit MDR ?)
    Membre du comité "Mort aux cons ! ARG..."
    Plus on essaye, et plus on a de chances de réussir... proverbe Shadok.
    Pensez au tag [Résolu], merci.

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    il te faut spécifier une taille à blague, comme tu le fais pour cat...
    heu.. perso ça m'a toujours mis une erreure de syntaxe...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Déoslé d'avoir mis tant de temps pour répondre mais le mail de notification semble s'être perdu !

    Kimael, en effet j'ai pensé à quelque chose comme ça, j'ai déjà testé non pas avec MD5 Mais avec la longueur (length) de la blague...car je n'ai jamais utiliser MD5 avec mySQL.
    Je vais me renseigner !

    Swoög, impossible, j'ai toujours une erreur

    Je teste la première solution et reviens vous voir

    Merci !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Effectivement MD5() est la solution !

    J'essaie d'exécuter la requête prise sur SQLPro pour affichier les doublons, soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  DISTINCT *
    FROM blagues T1
    WHERE  EXISTS ( 
    SELECT  * 
    FROM blagues T2
    WHERE MD5( T1.blague )  <> MD5( T2.blague )  )
    Erreur de syntaxe près de EXISTS...

    Version de mySQL : 4.0.20

    Je vois arriver de là qu'il m'est impossible de faire des sous-requêtes...

    Je me trompe ?
    Il faut ré-écrire ça de manière à ce que ça passe sous mySQL 4.0.20...c'est pas gagné.

    Si vous avez des idées, merci !

  6. #6
    Membre habitué Avatar de Kimael
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Points : 159
    Points
    159
    Par défaut
    Les sous-requêtes sont supportées à partir de... bah je ne sais plus,
    mais si tu fais une recherche dans le forum MySql avec comme mot-clés
    sous-requêtes version, etc. ça devrait se retrouver
    Membre du comité "Mort aux cons ! ARG..."
    Plus on essaye, et plus on a de chances de réussir... proverbe Shadok.
    Pensez au tag [Résolu], merci.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Je confirme donc, sous-requête dispo à partir de mySQL 4.1

    Depuis tout à l'heure je tente de modifier la requête afin de la rendre compatible

    Si vous avez uelques suggestions :

    Merci !

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    et mettre ton champ md5 en unique ne suffit pas ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Swoög
    et mettre ton champ md5 en unique ne suffit pas ?
    Si ça suffit !

    Alors j'ai supprimé la table, je l'ai recréé en lui ajoutant un champ sign contenant le hash MD5 du champ blague.

    Lors de l'insertion (qui se fait depuis un fichier SQL), dès qu'un enregistrement qui existe déjà doit être inséré (un futur doublon quoi ), mySQL me retourne une erreur :

    Citation Envoyé par mySQL
    #1062 - Duplicate entry '0' for key 1
    Donc cela fonctionne partiellement puisque au lieu de continuer les insertions, mySQL stoppe tout

    Après quelques recherches je n'ai pas trouvé de solutions...
    IGNORE ne me convient pas car ça annule l'effet du champ UNIQUE.

    Je me retourne encore vers vous

    Comment continuer à exécuter des requêtes SQL après qu'une de celles-ci me retourne l'erreur ci-dessus ?

    Merci beaucoup !

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    J'ignore comment tu le fais, mais si tu le fais via phpMyAdmin, il n'a y pas beaucoup de solutions...

    le plus simple étant de séparer tes différentes requettes, puis de les faires une à une... long, mais fonctionnement garanti..
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Oui via phpMyAdmin car toutes les requêtes se trouvent dans un fichier SQL.

    En effet, j'ai bien peur de devoir me coder une petite page en PHP qui gère l'erreur retournée...

    Bon je suis plus à 5 minutes près

    Sujet résolu !

    Merci !

  12. #12
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Un technique plus simple pour trouver tes doublons :
    1-Modification de la base :
    2-Calcul de tous les champs MD5
    3-Récupération des doublons

    J'ai fait les requêtes suivantes au pied levé... Je n'ai pas vérifié la syntaxe...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ALTER TABLE blagues ADD COLUMN md5_unique char(32);
     
    update blagues set md5_unique=md5(blague);
     
    select count(*) as doublon,md5_unique from blagues 
    group by blague
    having doublon >= 2;
    De plus, rien ne t'empêche de mettre une contrainte d'unicité sur ton champ md5_unique, une fois les doublons éliminés. Ainsi, a chaque insertion tu pourras être sûr que cette blague n'est pas déjà présentes.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

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

Discussions similaires

  1. [AC-2003] Ouvrir un lien hypetexte en cliquant sur champ de type texte
    Par bibicalou dans le forum IHM
    Réponses: 1
    Dernier message: 17/11/2010, 16h40
  2. Champs input type="text" n'apparait pas sur une image
    Par sofuzion dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 04/06/2009, 09h16
  3. substring sur champ de type text
    Par jarod_bx dans le forum Sybase
    Réponses: 5
    Dernier message: 13/06/2007, 07h35
  4. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  5. Fonction LEFT sur champ de type "text" : méthodes
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/06/2004, 11h15

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