2010-08-16 5 views

Répondre

33

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(); 
+1

sympa à chose à foreign_key – IcanDivideBy0

5

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'); 
+0

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. –

+0

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

+0

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

2

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).

2

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.

+0

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. –

+0

Absolument. Cela pourrait prendre plusieurs passages. –

+0

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. –

2

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.

2

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); 
?> 
Questions connexes