Actualicé mi respuesta para realizar la caída de las tablas sin usar un procedimiento almacenado. Darle una oportunidad !!!
RolandoMySQLDBA
Respuestas:
11
Aquí hay un procedimiento almacenado que acepta la base de datos y la cadena de prefijo como parámetros:
DELIMITER $$DROPPROCEDURE DropTablesWithPrefix $$CREATEPROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGINDECLARE ndx,maxidx INT;DECLARE giventable,SQLSTMT VARCHAR(500);CREATETABLE TableZapList
(
droptablesql VARCHAR(512),
idx INT NOTNULL AUTO_INCREMENT PRIMARYKEY) ENGINE=MyISAM;INSERTINTO TableZapList (droptablesql)SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)FROM information_schema.tables
WHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx))= prfx;SELECT COUNT(1)INTO maxid FROM TableZapList;IF maxid =0THEN
LEAVE StoredProcedure;ENDIF;<BR>SET ndx =0;WHILE ndx < maxid DO
SET ndx = ndx +1;SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;SET@sql = SQLSTMT;
PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;ENDWHILE;<BR>SELECT droptablesql FROM TableZapList;DROPTABLE TableZapList;END;
DELIMITER ;
ACTUALIZACIÓN 2011-07-12 14:55 EDT
Solo pensé en una forma más limpia y simplista. En lugar de usar un procedimiento almacenado, simplemente use la función GROUP_CONCAT para reunir todas las tablas para zap. Luego componga en una sola consulta:
Aquí hay una consulta para descartar todas las tablas que comienzan con wp_pol en la base de datos actual:
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')FROM information_schema.tables
WHERE table_schema=database()AND table_name like'wp_pol%';
Lo siguiente que debe hacer es almacenar el resultado en
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')INTO@dropcmd
FROM information_schema.tables
WHERE table_schema=database()AND table_name like'wp_pol%';
Lo último es ejecutar el SQL dinámico utilizando estos tres (3) comandos:
El script de Rolandos funciona, pero es posible que sea necesario aumentar el parámetro group_concat_max_len si tiene muchas tablas o nombres de tabla muy largos: SET SESSION group_concat_max_len = 1000000;
JohnP
En lugar de cambiar group + concat_max_len, utilicé una subconsulta con un límite y
realicé
La SUBSTRcondición en el INSERTdebería ser: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxentonces funciona bien.
Laurent
8
En primer lugar, genere un script para hacer esto en el indicador de Unix:
$ echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';"|mysql --user=root --password=blah --batch >drop.sql
Reemplace el prefijo con el suyo. La --batchopción suprime el formato sofisticado que MySQL hace de manera predeterminada para que pueda producir un script SQL ejecutable.
Revise el script y, si se ve bien, ejecútelo drop.sqlen el mysql>indicador.
Ya he hecho un script php helper para hacer esto, sin embargo, me preguntaba si se puede hacer usando una sola consulta.
poelinca
1
Respuesta simple: No. Respuesta compleja: Sí, si lo envuelve en un procedimiento almacenado . Entonces podría ejecutarlo en un comando, pero sería lo mismo que llamar a un script.
Cayo
4
Debe consultar las tablas del sistema para esos nombres de tabla y crear una cadena para ejecutarla dinámicamente. En SQL Server, haría algo como:
declare@x varchar(max),@enter char(2);select@x ='',@enter = char(13)+char(10);Select@x =@x +'drop table '+ table_name +';'+@enter
from information_schema.tables
where table_name like'%accounting%'print@x
execute(@x);
Ahora tiene que encontrar la tabla del sistema correspondiente en MySQL.
Leí tu respuesta con mucho cuidado. Esto es sinónimo de mi respuesta. Aunque en el dialecto de SQL Server, su respuesta es, en principio, la primera respuesta correcta. +1 !!!
RolandoMySQLDBA
3
Para responder a su pregunta, no. No en MySQL usando un solo comando / consulta. Tendrás que encadenar comandos.
Sin embargo, si desea lograr su objetivo, aquí hay una manera:
De un script bash algo como:
#/bin/bash
TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'"-u user-p`for i in$TABLES;
do
echo "DROP TABLE $i;">> drops.sql ;
done
cat drops.sql
Luego revise el archivo drops.sql. Si todo está bien, haga una COPIA DE SEGURIDAD , luego ...
mysql -u username -p -v --show-warnings < drops.sql
Respuestas:
Aquí hay un procedimiento almacenado que acepta la base de datos y la cadena de prefijo como parámetros:
ACTUALIZACIÓN 2011-07-12 14:55 EDT
Solo pensé en una forma más limpia y simplista. En lugar de usar un procedimiento almacenado, simplemente use la función GROUP_CONCAT para reunir todas las tablas para zap. Luego componga en una sola consulta:
Aquí hay una consulta para descartar todas las tablas que comienzan con wp_pol en la base de datos actual:
Lo siguiente que debe hacer es almacenar el resultado en
Lo último es ejecutar el SQL dinámico utilizando estos tres (3) comandos:
Aquí hay una demostración usando MySQL 5.5.12 en Windows que funciona:
Darle una oportunidad !!!
fuente
SUBSTR
condición en elINSERT
debería ser:SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
entonces funciona bien.En primer lugar, genere un script para hacer esto en el indicador de Unix:
Reemplace el prefijo con el suyo. La
--batch
opción suprime el formato sofisticado que MySQL hace de manera predeterminada para que pueda producir un script SQL ejecutable.Revise el script y, si se ve bien, ejecútelo
drop.sql
en elmysql>
indicador.fuente
Debe consultar las tablas del sistema para esos nombres de tabla y crear una cadena para ejecutarla dinámicamente. En SQL Server, haría algo como:
Ahora tiene que encontrar la tabla del sistema correspondiente en MySQL.
fuente
Para responder a su pregunta, no. No en MySQL usando un solo comando / consulta. Tendrás que encadenar comandos.
Sin embargo, si desea lograr su objetivo, aquí hay una manera:
De un script bash algo como:
Luego revise el archivo drops.sql. Si todo está bien, haga una COPIA DE SEGURIDAD , luego ...
fuente
Siempre puede usar un ADMINISTRADOR DE BASE DE DATOS como navicat y ese tipo de problemas desaparecerán con una simple selección y eliminación.
fuente