Suppression de tous les index MySQL avec PHP

Voici une petit code PHP pour supprimer tous les index d’une base MySQL, appliqué au framework Symfony, il supprime tous les clés étrangères créées et les index correspondants.

<?php

// Changez votre config ici
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_BASE', 'db');

// Connection à la base
$c = mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_select_db(DB_BASE);

// Désactivation de la vérification d'intégrité des clés
mysql_query("SET foreign_key_checks=0;");

// DROP des clés étrangères qui commencent par "FK_"
$resFk = mysql_query("SELECT DISTINCT table_name, constraint_name"
  . " FROM information_schema.key_column_usage"
  . " WHERE constraint_schema = '".DB_BASE."'"
  . " AND referenced_table_name IS NOT NULL"
  . " AND constraint_name LIKE 'FK_%'");
while($row = mysql_fetch_assoc($resFk))
{
	mysql_query("ALTER TABLE `".$row[table_name]."` DROP FOREIGN KEY `".$row[constraint_name]."`") or die(mysql_error());
}
mysql_free_result($resFk);

// On parcours la liste des tables
$resTables = mysql_query("SHOW TABLES;");
while ($table = mysql_fetch_row($resTables))
{
	// On parcours la liste des index de la table, dans cet exemple, qui commencent par "IDX_" (nommage de Symfony)
	$resIndexes = mysql_query("SHOW INDEX FROM `".$table[0]."` WHERE `Key_name` LIKE 'IDX_%';");
	while ($row = mysql_fetch_object($resIndexes))
	{
		// Enfin on drop l'index
		mysql_query("DROP INDEX `".$row->Key_name."` ON `".$row->Table."`;") or die(mysql_error());
	}
	mysql_free_result($resIndexes);
}
mysql_free_result($resTables);

// Réactivation de la vérification d'intégrité des clés
mysql_query("SET foreign_key_checks=1;");

mysql_close();
Cette entrée a été publiée dans Tip, avec comme mot(s)-clef(s) , . Vous pouvez la mettre en favoris avec ce permalien.