Ich möchte alle Tabellen aus der Datenbank löschen, aber nicht die Datenbank selbst löschen. Ist es möglich ? Ich suche nur nach einem kürzeren Weg als die Datenbank zu entfernen und neu zu erstellen. Vielen Dank !Wie Sie alle Tabellen in der Datenbank löschen, ohne die Datenbank selbst zu löschen?
Antwort
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();
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');
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. –
Wie fredley sagte, wenn Sie nichts als die leere Datenbank brauchen, lassen Sie sie einfach fallen und erstellen Sie sie neu. – Chris
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
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).
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.
Möglicherweise müssen Sie ein solches Skript wiederholt anwenden, da das Vorhandensein von Fremdschlüsseleinschränkungen verhindern kann, dass Tabellen gelöscht werden. –
Absolut. Es könnte mehrere Pässe dauern. –
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. –
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.
Es gibt einige hier Lösungen in den Kommentaren: http://dev.mysql.com/doc/refman/5.1/en/drop-table.html
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);
?>
nett zu ding bei foreign_key – IcanDivideBy0