Le mieux est de procéder en deux temps pour chaque table, d’abord faire une sélection pour vérifier qu'il y a bien des enregistrements à supprimer:
Exemple avec la table "bb_posts"
SELECT children.topic_id AS children_topic_id, topics.topic_id AS topics_topic_id
FROM x255_bb_posts children
LEFT JOIN x255_bb_topics topics ON children.topic_id = topics.topic_id
WHERE topics.topic_id IS NULL;
Et ensuite si il y a des enregistrement, les supprimer:
DELETE children FROM x255_bb_posts children
LEFT JOIN x255_bb_topics topics ON children.topic_id = topics.topic_id
WHERE topics.topic_id IS NULL;
Le principe, faire une liaison a gauche sur la table à nettoyer avec la table principale. Cela permet de sélectionner tous les enregistrements de la table enfants même si 'il n'y a pas d'enregistrement dans la table principale. Pour les enregistrements manquants le champ de la table principale qui n'existe pas aura pour valeur "Null"; Il suffit d'ajouter une clause "WHERE" en testant le champs de la table principale, si il est nul il faut supprimer l'enregistrement de la table enfant.
Dans les deux requêtes en exemples il suffit de remplacer le nom de la table enfant et le préfixe des tables "x255_" dans mon exemple soit:
1 - remplacer "
x255_posts" par "x255_archive" par exemple
2 - remplacer "
x255_" par le préfixe utilisé dans la base
Comme j'ai utilisé des alias le reste n'est pas à modifier.
SELECT children.topic_id AS children_topic_id, topics.topic_id AS topics_topic_id
FROM
x255_bb_posts children
LEFT JOIN
x255_bb_topics topics ON children.topic_id = topics.topic_id
WHERE topics.topic_id IS NULL;
DELETE children FROM
x255_bb_posts children
LEFT JOIN
x255_bb_topics topics ON children.topic_id = topics.topic_id
WHERE topics.topic_id IS NULL;
JJDai
PS: Précaution d'usage, faire une sauvegarde de la base ou des tables du module, on ne sait jamais,
et peut être relancer un synchro pour finir.