Je voudrais supprimer toutes les tables de la base de données, mais ne supprimant pas la base de données elle-même. C'est possible ? Je cherche juste un moyen plus court que de supprimer la base de données et de la créer à nouveau. Merci !Comment faire pour supprimer toutes les tables dans la base de données sans laisser tomber la base de données elle-même?
Répondre
Le plus court est de recréer la base de données. mais si vous ne voulez pas ...
Ceci est pour MySQL/PHP. Non testé mais quelque chose comme ça.
$mysqli = new mysqli("host", "my_user", "my_password", "database");
$mysqli->query('SET foreign_key_checks = 0');
if ($result = $mysqli->query("SHOW TABLES"))
{
while($row = $result->fetch_array(MYSQLI_NUM))
{
$mysqli->query('DROP TABLE IF EXISTS '.$row[0]);
}
}
$mysqli->query('SET foreign_key_checks = 1');
$mysqli->close();
Il n'y a pas de façon simple de faire cela. Soit vous aurez besoin de savoir ce que les tables sont à l'avance: et recréer
// modifier vous pouvez obtenir ces informations en utilisant la requête SHOW TABLE STATUS
$tables = array('users','otherdata');
foreach($tables as $table){
db.execute("DROP TABLE "+$table);
}
ou vous pouvez déposer la base de données elle vide (il est vraiment pas beaucoup d'efforts):
db.execute('DROP DATABASE SITEDATA');
db.execute('CREATE DATABASE SITEDATA');
S'il y a d'autres choses dans la base de données (procédures stockées, les fonctions et les autorisations des utilisateurs associés avec ces choses) laisser tomber la base de données peut ne pas être la chose que l'OP veut. –
Comme l'a dit Freddy, si vous n'avez besoin de rien d'autre que la base de données vide, déposez-la et recréez-la. – Chris
Si vous ne pouvez pas faire un DROP/CREATE, la première méthode est la seule façon, vous ne pouvez pas supprimer toutes les tables dans une seule commande. – fredley
Vous auriez à déposer toutes les tables dans la db séparément, donc laisser tomber la base de données et le recréer sera effectivement le plus court chemin (et le plus rapide pour cette matière).
Lorsque je devais le faire dans Oracle, j'écrivais une instruction select qui générait les instructions de table de dépôt pour moi. Quelque chose à l'effet de:
Sélectionnez 'DROP TABLE' || nom_table || ';' de user_tables;
Je pourrais alors diriger la sortie de l'instruction select vers un fichier. Après avoir couru cela, j'aurais un fichier qui laisserait tomber toutes mes tables pour moi. Cela ressemblerait à quelque chose comme:
DROP TABLE TABLE1;
DROP TABLE TABLEAU2;
DROP TABLE TABLEAU 3;
etc ...
Pas un expert MySQL, mais j'imagine qu'il aurait une installation similaire à la fois sélectionner toutes les tables pour un schéma, ainsi que la sortie directe d'une instruction SQL dans un fichier.
Vous devrez peut-être appliquer à plusieurs reprises un tel script, car la présence de contraintes de clé étrangère peut empêcher la suppression des tables. –
Absolument. Cela pourrait prendre plusieurs passages. –
Hmm, pas nécessairement. Si vous supprimez toutes les tables dans une transaction, vous pouvez reporter les vérifications de contrainte ('SET CONSTRAINTS ALL DEFERRED;') dans Oracle. En MySQL, vous pouvez désactiver temporairement les vérifications de clés étrangères (comme dans ma solution - 'SET foreign_key_checks = 0;') Cela peut au moins réduire le nombre de phases nécessaires. –
Utilisez SHOW TABLE STATUS
pour obtenir toutes les tables dans votre base de données, puis bouclez le résultat et déposez-les un par un.
Il y a quelques solutions ici dans les commentaires: http://dev.mysql.com/doc/refman/5.1/en/drop-table.html
je avais besoin de laisser tomber toutes les tables, sauf deux d'une décharge accidentelle.
Une fonction PHP pour abandonner toutes les tables, sauf quelques-uns (adapté de here), pour quelqu'un d'autre qui pourraient avoir besoin:
<?php
$mysqli = new mysqli("localhost", "user", 'password', "database");
function drop_all_tables($exceptions_array, $conn) {
$exceptions_string="('" ;
foreach ($exceptions_array as $table) {
$exceptions_string .=$table . "','";
}
$exceptions_string=rtrim($exceptions_string, ",'");
$exceptions_string .="')" ;
$sql="SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name NOT IN $exceptions_string";
$result=$ conn->query($sql);
while($row = $result->fetch_array(MYSQLI_NUM)) {
$conn->query($row[0]);
}
}
//drop_all_tables(array("table1","table2","table3","table4"), $mysqli);
?>
sympa à chose à foreign_key – IcanDivideBy0