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

PHP & Base de donn�es Discussion :

Supprimer les doublons dans une table


Sujet :

PHP & Base de donn�es

  1. #1
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut Supprimer les doublons dans une table
    Bonjour � toutes et � tous,

    Je dispose d'une table dont les donn�es proviennent d'un formulaire.
    Ce formulaire est compl�t� par des tiers personnes.

    Cette table sera susceptible de disposer de doublons.
    J'aimerai cr�er un petit programme pour supprimer les doublons de cette table.

    Je ne dispose pas encore d'un grand niveau en SQL du coup ce qui pourrait �tre simple et laborieux pour moi actuellement.

    Je suis tomb� sur un morceau de code que j'ai agr�menter � ma sauce mais, bien �videmment, cela ne marche pas

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    	//Je vais supprimer les doublons		
    		SELECT   COUNT(*) AS nbr_doublon, avis_clients_email, avis_clients_produits, avis_clients_commentaire
    		FROM     avis_clients_valides
    		WHERE    avis_clients_validation_webmaster ="N"
    		GROUP BY avis_clients_email, avis_clients_produits, avis_clients_commentaire
    		HAVING   COUNT(*) > 1
    	?>
    Ce code me renvoie l'erreur suivante :
    Parse error: syntax error, unexpected identifier "COUNT"

    J'imagine que :
    Soit COUNT devait �tre d�termin� avant
    Soit il y a une autre mani�re d'�crire ce morceau de code (oui j'ai encore un peu de mal � ce niveau la, je vois pas mal de fa�on de proc�der pour �crire les instructions et je m'y perds encore un peu).

    L'id�e ici est de parcourir la table est :
    1 - Si le commentaire n'a pas �t� valid� par le webmaster
    2 - Alors je v�rifie si j'ai des lignes en doublon dont les champs email produit et commentaire sont strictement identiques
    3 - Si oui, je supprime la ligne de ma table
    3 - Si non je ne fais rien
    1 - Si le commentaire a d�j� �t� valid�, je ne regarde pas cette ligne

    D'avance merci pour votre aide

  2. #2
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par d�faut
    Je ne remarque rien pouvant expliquer l'erreur dans ta requ�te que j'aurais plut�t �crite comme ceci:
    Code sql : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
      count(1) AS nbr_doublon,
      avis_clients_email,
      avis_clients_produits,
      avis_clients_commentaire
    FROM avis_clients_valides
    WHERE avis_clients_validation_webmaster = "N"
    GROUP BY
      avis_clients_email,
      avis_clients_produits,
      avis_clients_commentaire
    HAVING nbr_doublon > 1

    Par contre je ne suis pas fan de tes noms de colonnes et tables qui passent du singulier au pluriel et du pluriel au singulier, c'est un coup � se planter. Peut-�tre une erreur � ce niveau l�?




    PS: il est possible de cr�er une contrainte d'unicit� sur plusieurs colonnes pour une table, emp�chant de fait les doublons de se produire.

  3. #3
    Expert confirm�
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 670
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    Par d�faut
    vous avez m�lang� du code php et requ�te sql. regardez le code que vous nous avez montr� l� :
    https://www.developpez.net/forums/d2.../#post12068856

    pour les requ�tes sql complexes, je vous conseille de les tester d'abord dans un outil comme phpmyadmin. vous verrez mieux le r�sultat et cela vous aidera � exploiter le r�sultat dans votre code php.

  4. #4
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut
    Merci � vous pour vos r�ponses.

    J'ai v�rifi� mes composantes et elles sont correctes.
    L'erreur vient bien du code.

    Oui tu as raison, il sera n�cessaire que je trouve une mani�re d'�crire plus coh�rente car avec des codes plus complexes... �a devient complexe sans une vraie organisation.

    J'ai encore effectivement du mal � s�parer le code PHP et SQL.
    Et beaucoup de mal avec le code SQL (il existe diff�rentes mani�re et je suis un peu perdu).
    Je te remercie pour la piste que tu m'as donn�, je veux bien un autre indice si possible ?

  5. #5
    Mod�rateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    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 599
    Billets dans le blog
    10
    Par d�faut
    Bonjour,

    L'usage est de nommer les tables au singulier, par exemple "avis_client_valide" plut�t que "avis_clients_valides", car une table est la version physique d'un type d'entit� ou classe d'entit� au niveau conceptuel, et l'on se doute bien qu'une table contient potentiellement plusieurs occurrences de l'entit�.
    Il en va de m�me pour les colonnes, l� c'est parce qu'une occurrence de colonne n'est sens�e contenir qu'une seule valeur.

    Ensuite, d�tecter les doublons, c'est une chose, mais il faut ensuite choisir laquelle des lignes redondantes est � conserver.
    Si les colonnes sur lesquelles le regroupement est fait sont identiques, il est fort possible que les valeurs des autres colonnes soient diff�rentes. Peut-�tre faut il conserver celle des lignes dont la mise � jour est la plus r�cente, peut-�tre la plus ancienne, peut-�tre est-ce un autre crit�re qui fait foi.
    Donc attention, un programme ne saura peut-�tre pas toujours laquelle des lignes il faut conserver, si le volume est modeste, une s�lection manuelle est possiblement pr�f�rable.

  6. #6
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut
    Merci pour vos retours

    Je prends note pour l'usage qui est fait pour les tables ainsi que les colonnes.
    Merci

    Je suis d'accord pour les autres colonnes qui pourraient �tre diff�rentes.
    Dans le cas pr�sent, les informations des autres colonnes ont moins d'importance pour l'usage que je veux en faire.
    Du coup, le programme pourra conserver 1 ligne (par exemple la plus r�cente) et supprimer toutes les autres occurrences.

  7. #7
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut
    Citation Envoy� par mathieu Voir le message
    vous avez m�lang� du code php et requ�te sql. regardez le code que vous nous avez montr� l� :
    https://www.developpez.net/forums/d2.../#post12068856

    pour les requ�tes sql complexes, je vous conseille de les tester d'abord dans un outil comme phpmyadmin. vous verrez mieux le r�sultat et cela vous aidera � exploiter le r�sultat dans votre code php.
    Comme je l'ai dis, j'ai beaucoup de mal avec le lien PHP/MySQL, je vois encore tr�s peu comment les faire communiquer entre eux.
    En suivant ton indice, j'imagine que le premier morceau pour les faire communiquer entre eux ressemble � cela :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    $Programme=$acces_bdd->prepare('SELECT count(1) AS nbr_doublon, avis_clients_email, avis_clients_email, avis_clients_commentaire
    		FROM avis_clients_valides WHERE avis_clients_validation_webmaster = "N" 
    		GROUP BY avis_clients_email, avis_clients_produits, avis_clients_commentaire HAVING nbr_doublon > 1');
    Si je ne dis pas de b�tise, ce r�sultat (que je ne sais pas comment traiter en couple php/mySql) va me renvoyer une copie de ma table compl�te en prenant soin de retirer les doublons.
    C'est bien cela ?

    Si oui, cela veut dire que je dois :
    . Soit stocker toutes ces donn�es dans un tableau temporaire, vider ma table "avis_clients_valides" et r�inscrire toutes les donn�es de mon tableau temporaire dans ma table
    . Soit avoir une table vierge � c�t� ou je colle ces donn�es, puis je vide ma table principale, je colle mes donn�es de la table 'vierge' dans ma table principale et enfin je vide ma table 'vierge'
    Si c'est bien cela ? C'est pr�f�rable de ne pas avoir une trop grosse quantit� de donn�es pour faire cela. J'imagine alors (si mon cheminement est correct, qu'il existe des solutions plus efficaces que cela)

  8. #8
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut
    � Si le seul outil que vous avez est un marteau, vous tendez � voir tout probl�me comme un clou � Abraham Maslow...

    Partant de la, voil� la solution "Mc Gyver" � laquelle j'ai pens�...

    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
    //Je vais supprimer les doublons	
    		//Je compte le nombre de ligne de dépat dans ma table
    			//Accès à la table
    			$acces_bdd = $acces_bdd -> query('SELECT * FROM avis_clients_valides'); 
    			$_nombre_initial_lignes = 0;
    			while ($Ma_Recherche = $acces_bdd -> fetch())
    			{
    				$_nombre_initial_lignes = $_nombre_initial_lignes + 1; //Cela me servira de ligne de fin pour ma seconde boucle
    			}
     
    		//Je vais vérifer la ligne parcouru actuellement par mon while avec toutes les autres lignes de la table pour trouver les occurences
    			//Accès à la table
    			$acces_bdd = $acces_bdd-> query('SELECT * FROM avis_clients_valides'); 
    			$_ligne_actuel_while = 0;
    			$_lignes_supprimees = 0; // Ceci me permettra de mettre à niveau ma ligne de fin de ma seconde boucle, au plus je supprime, au moins il reste de ligne... 
    			while ($Ma_Recherche = $acces_bdd -> fetch())
    			{
    				$_ligne_actuel_while = $_ligne_actuel_while + 1; //Ma ligne actuelle du while est ma ligne de départ de ma seconde boucle
    				for($ligne = $_ligne_actuel_while; $ligne<=($_nombre_initial_lignes-$_lignes_supprimees);$ligne++)
    				{
    					if($Ma_Recherche['avis_clients_validation_webmaster']=="N") //Je ne touche pas aux lignes validées par le webmaster
    					{
    						//Je vais demander ici à ce que mes trois lignes correspondent à la ligne en cours => occurence
    						if($Ma_Recherche['avis_clients_email']==$Ma_Recherche[$ligne]['avis_clients_email'] AND Ma_Recherche['avis_clients_produits']==$Ma_Recherche[$ligne]['avis_clients_produits'] AND    Ma_Recherche['avis_clients_commentaire']==$Ma_Recherche[$ligne]['avis_clients_commentaire'])
    						{
    							echo '<p>je decouvre un N -ID:'.$Ma_Recherche['id'].' while :'.$_ligne_actuel_while.'For :'.$ligne.'</p>';
    							//J'insère ici la requete pour supprimer la ligne + j'incremente mon compteur $_lignes_supprimees
    						}
    					}
    				}
    			}
    Et comme disait ma prof de Maths... c'est en forgeant qu'on devient forgeron et...
    Je dois encore m'am�liorer avec le marteau
    La ligne suivante ne passe pas :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    if($Ma_Recherche['avis_clients_email']==$Ma_Recherche[$ligne]['avis_clients_email'] AND Ma_Recherche['avis_clients_produits']==$Ma_Recherche[$ligne]['avis_clients_produits'] AND Ma_Recherche['avis_clients_commentaire']==$Ma_Recherche[$ligne]['avis_clients_commentaire'])
    Fatal error: Uncaught TypeError: Cannot access offset of type string on string in
    Question :
    Sur cette derni�re ligne :
    . est-ce une erreur d'�criture de ma part ? Si oui comment aurais-je du l'�crire ?
    . si ce n'est pas une erreur de ma part, cela veut dire que mon id�e de d�tourner mon "probl�me" SQL est seulement un mirage ?

    D'avance merci pour vos retours et commentaire qui m'aident � r�soudre mon probl�me mais aussi � comprendre et � m'am�liorer

    PS: J'avais bien pris en compte la remarque d'am�lioration pour le nom des tables / colonnes. Je n'ai pas fait de modification ici afin de rester constant sur les diff�rents param�tres de la probl�matique expos�e initialement

  9. #9
    Mod�rateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    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 599
    Billets dans le blog
    10
    Par d�faut
    une d�marche possible est de d�tecter les doublons, puis, de faire la liste des valeurs trouv�es pour les lignes ayant des doublons.

    Voici un exemple cr�� sous db<>fiddle dans lequel j'ai une table des personnes (identitifiant, nom, pr�nom, date de naissance, code, date de derni�re m�j)
    Pour le test, je consid�re qu'il y a doublon si nom+pr�nom+ddn sont identiques (dans la vraie vie c'est tr�s insuffisant )
    Et pour chaque doublon, j'utilise la fonction GROUP_CONCAT pour lister les valeurs trouv�es dans les autres colonnes, par ordre de date de mise � jour

    La requ�te :

    Code SQL : 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
    create table T1
          (  T1IDT   integer       primary key
           , T1NOM   varchar(50)   not null
           , T1PRN   varchar(50)   not null
           , T1DDN   date          not null
           , T1CD1   char(2)       not null
           , T1MAJ   date          not null
          )
    ;
    insert into T1
    values (001, 'Dupont', 'Micheline', '1935-02-16', 'XX', '2021-06-05')
         , (002, 'Martin', 'Louis', '1968-11-20', 'AB', '2020-01-10')
         , (003, 'Volfoni', 'Raoul', '1916-01-01', 'VA', '1995-12-21')
         , (004, 'Martin', 'Louis', '1968-11-20', 'ZZ', '2024-07-01')
         , (005, 'Lesage', 'Sidonie', '1996-05-04', 'U5', '2024-10-30')
         , (006, 'Volfoni', 'Raoul', '1916-01-01', 'VX', '1995-12-22')
         , (008, 'Volfoni', 'Raoul', '1916-01-01', 'X8', '2025-02-01')
         , (009, 'Abadie', 'Isabelle', '1998-02-20', 'BO', '2025-01-06')
    ;
    -- considérons qu'il y a doublon si même nom, prénom et date de naissance
    with dbl (dblnom, dblprn, dblddn, dblcnt) as
        (select T1NOM
              , T1PRN
              , T1DDN
              , count(*)
         from T1
         group by T1NOM
                , T1PRN
                , T1DDN
         having count(*) > 1 
        )
    select dblnom
         , dblprn
         , dblddn
         , dblcnt
         , GROUP_CONCAT(concat(T1MAJ,' : ', T1IDT, '-', T1CD1)
                        order by T1MAJ asc
                        separator ", ") as "Dtmaj : ident - Code"
    from dbl
    inner join T1
       on T1NOM = dblnom
      and T1PRN = dblprn
      and T1DDN = dblddn
    group by dblnom
           , dblprn
           , dblddn
           , dblcnt


    Le r�sultat :

    Nom : Sans titre.png
Affichages : 112
Taille : 7,2 Ko

    On n'affiche bien que les lignes pr�sentant des doublons (Martin et Volfoni)

    � partir de cette liste, on pourra d�cider de ce qu'il convient de faire. Par exemple ne conserver que les lignes dont la date de derni�re M�J est la plus r�cente.

  10. #10
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par d�faut
    Une mani�re d'�viter les doublons avec une contrainte: un exemple avec des clients qui commentent des produits.

    Il s'agit d'�viter qu'un m�me client fasse plusieurs fois le m�me commentaire sur un m�me produit, typiquement:
    • Le m�content bien d�cid� � montrer sa rage � la face du monde
    • Le trop enthousiaste
    • L'amn�sique
    • Celui qui veut remonter la file des commentaires


    Les tables:
    Code SQL : 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
    CREATE TABLE IF NOT EXISTS t_client (
       cli_id INTEGER NOT NULL auto_increment,
       cli_name VARCHAR(100) NOT NULL,
       cli_forname VARCHAR(100) NOT NULL,
       cli_mail VARCHAR(255) NOT NULL,
     
       PRIMARY KEY pk_cli_id (cli_id)
    ) ENGINE = InnoDB;
     
    CREATE TABLE IF NOT EXISTS t_product (
       pro_id INTEGER NOT NULL auto_increment,
       pro_name VARCHAR(255) NOT NULL,
       pro_description TEXT,
     
       PRIMARY KEY pk_pro_id (pro_id)
    ) ENGINE = InnoDB;
     
    CREATE TABLE IF NOT EXISTS t_comment (
      com_id INTEGER NOT NULL auto_increment,
      cli_id INTEGER NOT NULL,
      pro_id INTEGER NOT NULL,
      com_comment VARCHAR(2048) NOT NULL,
      com_print BINARY(16)
        GENERATED ALWAYS AS (unhex(md5(com_comment))) STORED,
      com_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
      com_valid BIT NOT NULL DEFAULT 0,
     
      PRIMARY KEY pk_com_id (com_id),
     
      FOREIGN KEY fk_cli_id (cli_id)
        REFERENCES t_client (cli_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
     
      FOREIGN KEY fk_pro_id (pro_id)
        REFERENCES t_product (pro_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
     
      UNIQUE uc_cli_id_pro_id_com_print (cli_id, pro_id, com_print)
    ) ENGINE = InnoDB;

    Dans la table t_comment, j'ai ajout� une contrainte d'unicit� sur les colonnes cli_id (l'id du client), pro_id (l'id du produit) et com_print (l'empreinte du commentaire). La colonne com_print est g�n�r�e automatiquement lors de l'insertion � partir de la colonne com_comment, il s'agit de l'empreinte md5 du commentaire. La raison pour laquelle je ne prends pas le commentaire lui-m�me mais son empreinte md5, est que cette derni�re a une taille fixe de 32 octets (quelque soit la taille du commentaire correspondant) et qu'une contrainte d'unicit� est limit�e en taille (ce qui ne collerait pas avec le VARCHAR(2048) du commentaire).


    Les donn�es (avec des commentaires redondants du m�me client pour un m�me produit):
    Code sql : 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
    INSERT INTO t_client (cli_name, cli_forname, cli_mail)
    VALUES ('Goudard', 'Micheline', '[email protected]'),
           ('Langlois', 'Maurice', '[email protected]'),
           ('Picard', 'Huguette', '[email protected]'),
           ('Jambier', 'Lucien', '[email protected]');
     
    INSERT INTO t_product (pro_name, pro_description)
    VALUES ('aspirateur traîneau', 'conception germanique, assemblé en Turquie, il est l''outil idéal contre la poussière'),
           ('mixeur plongeant', 'devenez le roi de la soupe'),
           ('four à pyrolyse', 'Avec son mode tourne-broche, réussissez vos poulets rôtis comme personne');
     
    INSERT IGNORE INTO t_comment (cli_id, pro_id, com_comment, com_valid)
    VALUES (4, 3, 'Je mange du poulet tous les jours', 1),
           (4, 3, 'Je mange du poulet tous les jours', 0),
           (1, 2, 'La notice papier n''est pas fournie', 0),
           (4, 3, 'Désormais, je mange du poulet tous les jours', 0),
           (2, 1, 'Je n''aime pas faire le ménage', 1),
           (2, 1, 'Je n''aime pas faire le ménage', 0),
           (2, 1, 'Je n''aime pas faire le ménage', 0),
           (3, 1, 'Je n''aime pas faire le ménage', 0),
           (3, 1, 'Il est relativement bruyant', 1),
           (2, 2, 'L''appareil chauffe vite', 1);


    On regarde le r�sultat:
    Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
      t_product.pro_name as produit,
      t_comment.com_comment as avis,
      concat(t_client.cli_forname, ' ', t_client.cli_name) as client,
      if (t_comment.com_valid, 'oui', 'non') as 'validé'
    FROM t_comment
    JOIN t_client ON t_comment.cli_id = t_client.cli_id
    JOIN t_product ON t_comment.pro_id = t_product.pro_id
    ORDER BY t_product.pro_name, t_comment.com_date DESC;

    d�mo

  11. #11
    Mod�rateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    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 599
    Billets dans le blog
    10
    Par d�faut
    Les contraintes d'unicit� sont en effet la meilleure fa�on d'�viter les doublons.

    Quelques remarques � ce sujet :
    • une contrainte d'unicit� est une r�gle de gestion, elle doit donc �tre r�dig�e en tant que telle et mod�lis�e d�s l'�tape conceptuelle (MCD) pour apparaitre clairement. Cette contrainte sera automatiquement g�n�r�e dans le mod�le tabulaire avec tout bon logiciel de mod�lisation ;
    • pour rappel, une contrainte primary key est implicitement une contrainte d'unicit� ;
    • quand il y a d�j� des doublons, c'est soit qu'il n'y a jamais eu de contrainte, soit qu'on l'a supprim�e. Il est n�cessaire de supprimer les doublons avant de r�activer ou d'installer la contrainte.

  12. #12
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut
    Bonjour,

    Merci pour vos retours.

    D�sol� j'ai �t� assez occup� ces derniers jours.
    Je r�gle un autre petit soucis en premier puis je reviens lire vos messages pour test/ mis en application (et progression en langage par la m�me occasion )

  13. #13
    Membre �clair�
    Inscrit en
    Mai 2008
    Messages
    248
    D�tails du profil
    Informations personnelles :
    �ge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par d�faut
    Bonjour,

    Suite � vos retours, j'ai mis un peu de temps afin de d�terminer quelle approche je devais aborder afin de r�gler ce probl�me.
    A noter que c'est gr�ce � vos retours et r�flexions que j'ai pu aboutir � ma conclusion actuelle

    L'approche que j'ai choisi n'est pas la meilleure approche, c'est juste l'approche � ma port�e suivant mon niveau de connaissances actuelles et le temps que je peux y accorder (il y a de nombreux sujets sur lesquels je dois progresser et je ne peux pas tout faire en m�me temps).

    Je suis donc parti sur un mixte entre :
    . Effacer 'manuellement' les lignes (au travers d'une interface quand m�me, faut pas d�conner
    . Ralentir les 'rageux' => utilisation d'une SESSION['Tu_as_post�___j'ai_ton_message____faut_attendre_pour_en_poster_un_autre'] =>
    Avantage : Cela permet d'�viter de surcharger ma table pour rien, et aussi de m'�viter de devoir effacer manuellement 50 fois le m�me message
    Inconv�nient : La personne qui s'est tromp�e dans son message et souhaite en renvoyer un autre... devra attendre avant de poster de nouveau son message.

    La solution n'est donc pas id�ale mais me parait �tre un bon compromis en l'�tat.

    J'ai plac� dans mes pistes de progression perso de la partie Base de Donn�es. (Elle commence � devenir longue ma liste )

    Un grand merci � tous pour vos retours

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Supprimer les doublons dans une table
    Par LoveCoding91 dans le forum Langage SQL
    R�ponses: 1
    Dernier message: 12/12/2019, 16h22
  2. supprimer les doublons dans une table
    Par mavean dans le forum Requ�tes et SQL.
    R�ponses: 6
    Dernier message: 26/06/2019, 13h26
  3. Supprimer les doublons dans une table
    Par lelectronique.com dans le forum Requ�tes
    R�ponses: 7
    Dernier message: 15/10/2008, 14h33
  4. Supprimer les doublons dans une table!
    Par Kirou dans le forum Requ�tes
    R�ponses: 3
    Dernier message: 03/06/2008, 15h37
  5. R�ponses: 2
    Dernier message: 14/06/2007, 22h24

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