2009-10-19 26 views

Respuesta

134

No puede hacerlo con sólo un único comando de MySQL, sin embargo se puede usar MySQL para construir la sentencia para usted:

En el cáscara de MySQL o a través de phpMyAdmin, utilice la siguiente consulta

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%'; 

Esto generará una sentencia DROP que se puede copiar y ejecutar de eliminar las tablas.

EDITAR: un descargo de responsabilidad aquí - la declaración generada arriba soltará todas las tablas en todas las bases de datos con ese prefijo. Si desea limitarlo a una base de datos específica, modificar la consulta para parecerse a esto y reemplazar nombre_basedatos con su propio nombre_basedatos:

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%'; 
+0

Tengo solo una base de datos, así que no necesitaré la segunda. –

+0

¡Gracias! Tan problemático que mi servidor MySQL es muy lento. Se necesitaron 10-15 minutos para ejecutar el script. Luego me llevó demasiado tiempo mostrar el guión completo, que lo detuve. Lo intentaré de nuevo cuando tenga más tiempo. –

+0

¿qué tal si se ignora la verificación de la clave externa? – Raptor

3

Usted puede hacer eso con sólo una orden de MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Es probable que tenga para construir la lista de tabla dinámica en el código sin embargo.

Un enfoque alternativo sería utilizar el general purpose routine library para MySQL 5.

17
show tables like 'prefix_%'; 

copiar los resultados y pegarlos en un editor de texto o salida de la consulta a un archivo, use algunas búsquedas y reemplaza para eliminar el formato no deseado y reemplace \n con una coma ponga un ; en el extremo y agregue una tabla desplegable al frente.

obtendrá algo que se parece a esto:

drop table myprefix_1, myprefix_2, myprefix_3; 
+0

no tuve acceso a information_schema.tables en el servidor de aplicaciones web que estoy usando, ¡así que este era el camino a seguir, gracias! – Florent

10

@andre-miller solución es buena pero hay aún mejor y un poco más profesional que le ayudará a ejecutar todo de una vez. Todavía necesitará más de un comando, pero esta solución le permitirá usar el SQL para compilaciones automatizadas.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES 
    WHERE TABLE_NAME LIKE 'myprefix_%'); 
PREPARE stmt FROM 'DROP TABLE @tbls'; 
EXECUTE stmt USING @tbls; 
DEALLOCATE PREPARE stmt; 

Nota: este código es dependiente de la plataforma, es para MySQL, pero seguro que podría implementarse para PostgreSQL, Oracle y MS SQL con ligeros cambios.

+0

ERROR 1064 (42000): Tiene un error en la sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '@ tbls' en la línea 1 ERROR 1243 (HY000): manejador de instrucciones preparadas desconocido (stmt) dado a EXECUTE ERROR 1243 (HY000): declaración preparada desconocida controlador (stmt) dado a DEALLOCATE PREPARE –

+0

Error de sintaxis en: PREPARE stmt FROM 'DROP TABLE @tbls'; –

1
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables 
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%"; 
25

Algunas de las respuestas anteriores fueron muy buenas. He reunido sus ideas con algunas nociones de otras respuestas en la web.

que necesitaba para eliminar todas las tablas que empiezan por 'temp_' Después de unas pocas iteraciones que se me ocurrió este bloque de código:

-- Set up variable to delete ALL tables starting with 'temp_' 
SET GROUP_CONCAT_MAX_LEN=10000; 
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
       FROM information_schema.TABLES 
       WHERE TABLE_SCHEMA = 'my_database' 
       AND TABLE_NAME LIKE 'temp_%'); 
SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
-- SELECT @delStmt; 
PREPARE stmt FROM @delStmt; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Espero que esto sea útil para otros programadores de MySQL/PHP.

1

Descubrí que las declaraciones preparadas fueron un poco difíciles de conseguir para mí, pero establecer el GROUP_CONCAT_MAX_LEN fue esencial cuando tienes muchas tablas.Esto dio lugar a un simple proceso de tres pasos con cortar y pegar desde la línea de MySQLcomando que funcionó muy bien para mí:

SET GROUP_CONCAT_MAX_LEN=10000; 
SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%'; 

Luego cuidadosamente cortar y pegar el largo DROP declaración resultante.

+0

finalizando la consulta con '\ G' en lugar de'; 'da un resultado un poco más limpio –

1

Sólo quería publicar el SQL exacta Solía ​​- es algo así como una mezcla de los 3 mejores respuestas:

SET GROUP_CONCAT_MAX_LEN=10000; 

SET @del = (
    SELECT  CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';') 
    FROM  information_schema.TABLES 

    WHERE  TABLE_SCHEMA = 'database_name' 
    AND   TABLE_NAME LIKE 'prefix_%' 
); 

PREPARE stmt FROM @del; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
3

me cae mesa con éxito por modificar consulta a como este

SET GROUP_CONCAT_MAX_LEN=10000; 
SET FOREIGN_KEY_CHECKS = 0; 
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`')) 
      FROM information_schema.TABLES 
      WHERE TABLE_SCHEMA = 'pandora' 
      AND TABLE_NAME LIKE 'temp_%'); 
SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
-- SELECT @delStmt; 
PREPARE stmt FROM @delStmt; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
SET FOREIGN_KEY_CHECKS = 1; 
+0

Este fue el único que encontré que hizo toda la operación en un shebang mientras se trataban las restricciones de clave externa. –

0

Solo otra solución usando GROUP_CONCAT por lo que se ejecutará una consulta de caída como
DROP TABLE table1, table2, ..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
     SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
     WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name' 
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm; 
DEALLOCATE PREPARE Stm; 
Cuestiones relacionadas