2010-08-16 11 views

Antwort

33

Der kürzeste ist Datenbank neu zu erstellen. aber wenn du nicht willst ...

Dies ist für MySQL/PHP. Nicht getestet, aber so etwas.

$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

nett zu ding bei foreign_key – IcanDivideBy0

5

Es gibt keine einfache Möglichkeit, dies zu tun. Entweder Sie müssen wissen, was die Tische im Voraus sind:

// bearbeiten Sie können diese Informationen erhalten mit der Abfrage SHOW TABLE STATUS

$tables = array('users','otherdata'); 
foreach($tables as $table){ 
    db.execute("DROP TABLE "+$table); 
} 

oder Sie können die Datenbank löschen und neu erstellen leer (es ist wirklich nicht so viel Aufwand):

db.execute('DROP DATABASE SITEDATA'); 
db.execute('CREATE DATABASE SITEDATA'); 
+0

Wenn es andere Dinge in der Datenbank (Stored Procedures, Funktionen und Benutzerberechtigungen zugeordnet Mit diesen Dingen kann das Ablegen der Datenbank nicht das sein, was das OP will. –

+0

Wie fredley sagte, wenn Sie nichts als die leere Datenbank brauchen, lassen Sie sie einfach fallen und erstellen Sie sie neu. – Chris

+0

Wenn Sie DROP/CREATE nicht ausführen können, ist die erste Methode die einzige Möglichkeit. Sie können nicht alle Tabellen in einem Befehl löschen. – fredley

2

Sie würden separat jede Tabelle in der db fallen müssen, so die Datenbank löschen und neu zu tatsächlich die kürzeste Route (und die schnellste für diese Angelegenheit sein).

2

Wenn ich dies in Oracle tun musste, würde ich eine Select-Anweisung schreiben, die die Anweisungen für die Drop-Tabelle für mich generieren würde. Etwas zu dem Effekt von:

Wählen Sie "DROP TABLE" || Tabellenname || ';' von user_tables;

Ich könnte dann die Ausgabe der Select-Anweisung in eine Datei pipe. Nachdem ich das ausgeführt hatte, würde ich eine Datei haben, die alle meine Tische für mich fallen lassen würde. Es würde ungefähr so ​​aussehen:

DROP TABLE TABLE1;

DROP TABLE TABLE2;

DROP TABLE TABLE3;

etc ...

kein MySQL-Experte, aber ich könnte mir vorstellen, es wäre eine ähnliche Anlage haben beide wählen Sie alle Tabellen für ein Schema, sowie die direkte Ausgabe von einer SQL-Anweisung in einer Datei.

+0

Möglicherweise müssen Sie ein solches Skript wiederholt anwenden, da das Vorhandensein von Fremdschlüsseleinschränkungen verhindern kann, dass Tabellen gelöscht werden. –

+0

Absolut. Es könnte mehrere Pässe dauern. –

+0

Hmm, nicht unbedingt. Wenn Sie alle Tabellen in einer Transaktion löschen, können Sie in Oracle Constraint-Prüfungen ('SET CONSTRAINTS ALL DEFERRED;') verschieben. In MySQL können Sie Fremdschlüsselprüfungen vorübergehend deaktivieren (wie in meiner Lösung - 'SET foreign_key_checks = 0;'). Dies kann zumindest die Anzahl der benötigten Phasen reduzieren. –

2

Verwenden Sie SHOW TABLE STATUS, um alle Tabellen in Ihrer Datenbank zu erhalten, dann führen Sie eine Schleife über das Ergebnis und löschen Sie sie einzeln.

2

Ich brauchte alle Tabellen außer ein paar von einer unbeabsichtigten Dump fallen zu lassen.

Ein PHP-Funktion werden alle Tabellen mit Ausnahme einiger (angepasst von here), für alle anderen fallen zu lassen, die benötigen:

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