Index de l'article

Correction des dernières erreurs

Malgré un bon fonctionnement du script, j'observe parfois quelques erreurs étranges : certains champs vides ou inexistants dans les pages web, ont tendance à se remplir en BDD avec les valeurs respectives du dernier enregistrement non-vide. Très pénible... Cela ne se produit pas depuis tous les sites inspectés, je n'ai pas compris pourquoi, mais vérifiez vos données avant de les utiliser.

Heureusement nous avons ajouté un identifiant auto-incrémenté dans notre table. Avec le code ci-dessous nous allons pouvoir corriger les erreurs en vidant les doublons en fonction de leur ordre d'apparition en base. Exemple sur un champ website, la table d'origine s'appelle ici ma_table :

DROP TABLE IF EXISTS tmp_website_duplicates ;
CREATE TABLE tmp_website_duplicates AS
SELECT website, min(id) as min_id, count(id) as total
FROM ma_table
GROUP BY website
HAVING website NOT LIKE ''
AND total > 1
ORDER BY total DESC ;
 
DROP TABLE IF EXISTS tmp_id_website_to_delete ;
CREATE TABLE tmp_id_website_to_delete AS
SELECT tmp_website_duplicates.website, min_id, id as id_website_to_delete
FROM tmp_website_duplicates
INNER JOIN ma_table
ON tmp_website_duplicates.website = ma_table.website AND min_id <> id
ORDER BY min_id, id ;
 
UPDATE ma_table
INNER JOIN tmp_id_website_to_delete
ON ma_table.id = tmp_id_website_to_delete.id_website_to_delete
SET ma_table.website = '' ;
 
DROP TABLE IF EXISTS tmp_website_duplicates, tmp_id_website_to_delete ;

La 1ère table liste les websites en doublons, les compte, mais surtout renvoie l'id du 1er enregistrement de chaque lot de doublons apparus en base (l'id le plus bas, celui qui ne doit pas être modifié).

La 2nd trie les ids des websites en doublons : d'un côté les 1ers apparus en base, de l'autre les derniers ids suivants (ceux qui doivent être modifiés).

Ensuite une requête de mise-à-jour vide les champs en doublons des derniers ids des lots de doublons de votre table d'origine, sans toucher aux premiers ids.

Hop ! Faîtes ainsi pour tous les champs ayant subi des intrusions.