Actuellement, je travaille sur un script PHP de migration de données d’une structure de base de données à une autre. L’ancienne structure était composée de table au format MyISAM sans contraintes référentielles (vu que ce format ne gère pas la déclaration de FOREIGN KEY). La nouvelle structure, quant à elle, est composée de table au format InnoDB où les intégrités référentielles sont déclarées.
Le problème avec ces contraintes référentielles, c’est que mon script de migration bloque dès qu’une de ces contraintes n’est pas respectée. Je vous l’accorde, ce n’est pas un problème en soi puisque c’est justement le but lorsqu’on déclare les intégrités référentielles : vérifier la cohérence du contenu de la base de données.
Une fois que le script m’a renvoyé l’erreur, je le corrige et il me faut alors vider la table impactée afin de le relancer et vérifier que le problème est bien résolu. Si je tente un TRUNCATE ou un DELETE FROM sur ma table, MySQL me renvoie alors l’erreur suivante :
Error Code: 1701 Cannot truncate a table referenced in a foreign key constraint (...)
Bien. MySQL vérifie donc correctement les contraintes. Cependant, il faut bien que je vide ma table pour relancer mon script. Pour pallier à ce problème, il suffit donc de suspendre le contrôle des contraintes temporairement (le temps de la requête en fait) :
SET FOREIGN_KEY_CHECKS=0;
DELETE FROM bdd.table; -- ou autre(s) requête(s)
SET FOREIGN_KEY_CHECKS=1;
Et le tour est joué ! ^^