2009-01-17 34 views
26

Estoy escribiendo algunas secuencias de comandos de utilidad db, y una de las tareas que debo hacer es reconstruir solo los datos, pero dejar el esquema intacto. ¿Cuál es la forma más fácil de automatizar esto desde la línea de comandos usando bash y las herramientas mysql (sin php, etc.)?Cómo vaciar todas las filas de todas las tablas en mysql (en sql)

Actualización: Me gustaría que la solución maneje todas las tablas en un comando, y si es posible, no necesita ser actualizada si las tablas son agregadas o eliminadas.

Respuesta

50
TRUNCATE tableName; 

Esto vaciará el contenido de la tabla.

Editar en respuesta a la edición Q: Parece que de mi prueba rápida que tendrá que hacer al menos 2 consultas, ya que parece que "mostrar tablas" no se puede utilizar como una consulta secundaria, no sé cómo hacer esto en bash así que aquí hay un ejemplo de PHP, con suerte lo ayudará.

<?php  
mysql_connect('localhost', 'user', 'password'); 
$dbName = "database"; 
mysql_select_db($dbName); /*added semi-colon*/ 
$result_t = mysql_query("SHOW TABLES"); 
while($row = mysql_fetch_assoc($result_t)) 
{ 
    mysql_query("TRUNCATE " . $row['Tables_in_' . $dbName]); 
} 
?> 

Como mínimo esto necesita un poco de manejo de errores.

+0

¿Hay alguna manera de seleccionar los nombres de todas las tablas en el esquema de alimentar en esto? De lo contrario, tendré que actualizar el script cuando se agreguen nuevas tablas. –

+0

Intenté con TRUNCATE * pero no funcionó. Parece que tendrás que ejecutar una consulta SHOW TABLES y actuar de esa manera. – Ross

+0

Encontré este enlace http://sqlblogcasts.com/blogs/madhivanan/archive/2007/08/27/truncate-all-tables-part-i.aspx que tiene un procedimiento almacenado que se puede adaptar fácilmente a lo que necesita , o puede funcionar de la caja. – UnkwnTech

4

Si está en Unix/Linux puede utilizar el shell para ejecutar:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE] 

o racional relacional tiene un puesto blog sobre cómo escribir procedimiento almacenado para hacer esto.

+0

Este era el tipo de solución que estaba buscando, desafortunadamente falla en las restricciones fk. Como realmente no quiero soltar todas las restricciones y volver a agregarlas, escribir mis propios truncados termina funcionando mejor. –

+0

Puede probar SET FOREIGN_KEY_CHECKS = 0; –

+0

Esta es una buena manera de hacerlo, pero ¿por qué el grep para DROP? El OP pregunta por una forma de dejar el esquema intacto y de esta manera solo se eliminarán las tablas. Omita la parte grep y la secuencia de comandos funciona perfectamente. –

1

Aquí es una fiesta de una sola línea para truncar todas las tablas de una lista de bases de datos:

for j in database_name1 database_name2; \ 
do for i in `echo 'show tables ' |mysql $j \ 
|grep -v 'Tables_in'`; do mysql $j -e "truncate $i"; done; done 

Tenga en cuenta, el truncamiento se eliminarán todos los datos de las tablas de destino sin ninguna petición. Quizás cambie "truncar $ i" por "describir $ i" primero para asegurarse de que las tablas en el conjunto de resultados sean las destinadas a ser vaciadas.

Una cosa más: si desea iterar sobre cada mesa en todas las bases de datos MySQL (excepto information_schema y mysql, espero!), Sustituir lo siguiente para el anterior "database_name1 database_name2":

`echo 'show databases' | mysql | awk '$1 != "information_schema" && \ 
$1 != "mysql" {if (NR > 1) {print}}'` 

Entonces, aquí hay una muestra que es menos destructiva; Realiza Optimizar para todas las tablas en cada base de datos MySQL (excepciones como se señaló anteriormente):

for j in `echo 'show databases' | mysql | \ 
awk '$1 != "information_schema" && $1 != \ 
"mysql" {if (NR > 1) {print}}'`; do for i in \ 
`echo 'show tables ' |mysql $j |grep -v \ 
'Tables_in'`; do mysql -e "optimize table $j.$i"; \ 
done; done 

Modificar la "acción" realizado según sea necesario y con mucha inquietud!

+0

Esto no funciona con referencias de clave externa. Obtendrá errores de restricción de clave externa. –

+0

Esto es cierto; Sin embargo, ¿cuántos usuarios de MySQL usan FK? – rjamestaylor

+0

Hoy en día creo que encontrarás que la mayoría de los usuarios de MySQL usan FK, ciertamente lo hago. –

Cuestiones relacionadas