¿Es posible eliminar todas las tablas vacías de mi enorme base de datos (mysql)?
Estoy buscando un comando sql para eliminar automáticamente todas esas tablas vacías.
Actualmente, tengo 305 tablas en mi conjunto de datos, y alrededor del 30% de ellas son tablas vacías viejas, que no se usarán en mi nueva aplicación.
Solo para aclarar; Todas las tablas son de tipo = MyISAM
Respuestas:
La idea probablemente sería buscar las tablas vacías usando
INFORMATION_SCHEMA.TABLES
Entonces es posible que pueda generar una consulta SQL con
Rápido y un poco sucio, pero en realidad debería funcionar.
fuente
Como todas las tablas son MyISAM, esto hace que mi respuesta sea más fácil de expresar.
Primero, necesita consultar el INFORMATION_SCHEMA para las tablas que tienen cero filas:
A continuación, formule la consulta para descartar las tablas vacías:
Ahora, volcar los comandos en un archivo de texto SQL externo.
Mire los contenidos con uno de los siguientes
less DropTables.sql
cat DropTables.sql
Si está satisfecho con su contenido, ejecute el script:
o inicie sesión en mysql y ejecútelo así:
Darle una oportunidad !!!
PRECAUCIÓN : esta técnica solo funciona con la tabla MyISAM porque el recuento de filas de una tabla MyISAM se almacena físicamente en
.MYD
la tabla. La tabla de metadatos INFORMATION_SCHEMA.TABLES siempre está leyendo esto y actualizándose. ¡NO INTENTE ESTO CON INNODB!ACTUALIZACIÓN 2014-02-05 11:46 EST
Hay una razón por la que excluí
('information_schema','mysql','performance_schema')
El
mysql
esquema tiene tablas vacías. AlgunosMyISAM
, algunosInnoDB
, algunosCSV
.Por ejemplo, aquí están mis tablas en el esquema mysql para MySQL 5.6.15 en mi escritorio
Si algunas de esas mesas estaban a desaparecer (como
columns_priv
,proc_priv
,tables_priv
, etc.), el mecanismo de donaciones no funcione correctamente o puede hacer que mysqld no se inicie. Usted no quiere golpear mysql.proc ya que es el hogar físico de los procedimientos almacenados. Es posible que otros mecanismos no funcionen si desea usarlos, como la replicación CrashSafe usando las tablas InnoDB dentro del esquema mysql, o si desea insertar información de zona horaria.ACTUALIZACIÓN 2014-02-05 12:36 EST
Me gustaría felicitar a Tom Desp por su respuesta por una razón específica: su sintaxis podría eliminar sin usar un script externo . Usando su idea, permítanme capturar el comando DROP TABLE en una variable definida por el usuario.
Si la salida de la
SELECT @DropCommand;
es correcta, ejecute el comando de esta manera:Esto elimina dos cosas:
fuente