2010-08-16 15 views

Respuesta

33

Lo más corto es volver a crear la base de datos. pero si no quiere ...

Esto es para MySQL/PHP. No probado, pero algo así.

$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

nice to thing at foreign_key – IcanDivideBy0

5

No hay una manera simple de hacer esto. Ya sea que usted necesita saber lo que las mesas son de antemano:

// edición que puede obtener esta información a través de la consulta SHOW TABLE STATUS

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

o se puede dejar caer la base de datos y volver a crearlo vacía (en realidad no es mucho esfuerzo):

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

Si hay otras cosas en la base de datos (procedimientos almacenados, funciones y permisos de usuario asociados con estas cosas) dejar caer la base de datos puede no ser lo que el OP quiere. –

+0

Como dijo fredley, si no necesita nada más que la base de datos vacía, simplemente colóquelo y vuelva a crearlo. – Chris

+0

Si no puede hacer un DROP/CREATE, el primer método es la única manera, no puede colocar todas las tablas en un solo comando. – fredley

2

Habría que colocar cada mesa en el PP por separado, para dejar caer la base de datos y volver a crearlo en realidad será la ruta más corta (y la más rápida para el caso)

2

Cuando tenía que hacer esto en Oracle, escribía una declaración de selección que generaría los enunciados de la tabla de soltar para mí. Algo a los efectos de:

Seleccione 'DROP TABLE' || table_name || ';' de user_tables;

Pude canalizar la salida de la declaración de selección a un archivo. Después de ejecutar esto, tendría un archivo que soltaría todas mis tablas para mí. Se vería algo así como:

DROP TABLE TABLE1;

DROP TABLE TABLE2;

DROP TABLE TABLE3;

etc ...

No es un experto en MySQL, pero me imagino que tendría una instalación similar a ambas seleccione todas las tablas de un esquema, así como una salida directa de una sentencia SQL en un archivo.

+0

Es posible que tenga que aplicar repetidamente una secuencia de comandos de este tipo porque la presencia de restricciones de clave externa puede evitar que se eliminen las tablas. –

+0

Absolutamente. Podría tomar varios pases. –

+0

Hmm, no necesariamente. Si elimina todas las tablas en una transacción, puede diferir las verificaciones de restricciones ('SET RESTRAINTS ALL DEFERRED;') - en Oracle. En MySQL puede desactivar temporalmente las comprobaciones de claves externas (como en mi solución - 'SET foreign_key_checks = 0;') Esto puede al menos reducir el número de fases necesarias. –

2

Utilice SHOW TABLE STATUS para obtener todas las tablas en su base de datos, luego repita el resultado y suéltelas una a una.

2

que necesitaba para dejar todas las tablas excepto un par de un volcado accidental.

función

Un PHP para soltar todas las tablas excepto algunos (adaptado de here), para cualquier otra persona que pueda necesitar:

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