SQL: eliminar tablas con prefijo

101

¿Cómo borrar mis tablas que tienen el prefijo myprefix_?

Nota: es necesario ejecutarlo en phpMyAdmin

Deniz Zoeteman
fuente

Respuestas:

178

No puede hacerlo con un solo comando de MySQL, sin embargo, puede usar MySQL para construir la declaración por usted:

En el shell de MySQL o mediante PHPMyAdmin, use 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 declaración DROP que puede copiar y ejecutar para eliminar las tablas.

EDITAR: Un descargo de responsabilidad aquí: la declaración generada anteriormente eliminará todas las tablas en todas las bases de datos con ese prefijo. Si desea limitarlo a una base de datos específica, modifique la consulta para que se vea así y reemplace database_name con su propia database_name:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
Andre Miller
fuente
Solo tengo una base de datos, por lo que no necesitaré la segunda.
Deniz Zoeteman
4
@ElijahLynn, la fuente del límite probablemente se deba a la longitud máxima de GROUP_CONCAT. puede ampliarlo, ver por ejemplo aquí
Asaf David
7
Nota para uno mismo Aumente el número de caracteres máximos: SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid
2
Tenga en cuenta que, en algunos casos, es necesario escapar de los guiones bajos en los nombres de los prefijos de la tabla[...] LIKE 'myprefix\_%';
Magictallguy
1
Esto devuelve numerosos nombres de tabla duplicados. La respuesta que publicó Pankaj Khurana funciona mejor en mi humilde opinión.
Jeremy
37

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

Necesitaba eliminar todas las tablas que comenzaban con 'temp_' Después de algunas iteraciones, 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.

Bradley Slavik
fuente
1
Ésta es exactamente la respuesta correcta. Otras respuestas utilizan varios pasos o requieren que se haga manualmente. ¡No sé cómo esta respuesta no tiene más votos después de 4 años!
gbe
25
show tables like 'prefix_%';

copie los resultados y péguelos en un editor de texto o envíe la consulta a un archivo, use algunas búsquedas y reemplazos para eliminar el formato no deseado y reemplácelos \ncon una coma, coloque una ;al final y agregue una tabla desplegable al frente.

obtendrás algo que se parece a esto:

drop table myprefix_1, myprefix_2, myprefix_3;
Daniel
fuente
1
no tenía acceso a information_schema.tables en el servidor web que estoy usando, así que este era el camino a seguir, ¡gracias!
Florent Roques
10

La solución @ andre-miller es buena, pero hay una solución aún mejor y un poco más profesional que lo ayudará a ejecutar todo de una vez. Aún necesitará más de un comando, pero esta solución le permitirá usar 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 depende de la plataforma, es para MySQL pero seguro que podría implementarse para Postgre, Oracle y MS SQL con ligeros cambios.

Alex Rashkov
fuente
ERROR 1064 (42000): Tiene un error en su sintaxis SQL; Consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '@tbls' en la línea 1 ERROR 1243 (HY000): Manejador de declaraciones preparadas desconocido (stmt) dado a EXECUTE ERROR 1243 (HY000): Manejador de declaraciones preparadas desconocido (stmt) dado a DEALLOCATE PREPARE
Roni Tovi
Error de sintaxis en: PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg
5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
Pankaj Khurana
fuente
3

Dejo caer la tabla con éxito editando la consulta para que me guste esto

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;
Duong Vo
fuente
Este fue el único que encontré que hizo toda la operación en un solo shebang mientras abordaba las restricciones de clave externa.
Evan Mattson
2

Puede hacerlo en un comando con MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Sin embargo, probablemente tendrá que construir la lista de tablas dinámicamente en código.

Un enfoque alternativo sería utilizar la biblioteca de rutinas de propósito general para MySQL 5.

Asaf
fuente
2

Solo quería publicar el SQL exacto que utilicé; es una mezcla de las 3 respuestas principales:

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;
Danny Beckett
fuente
2

Solo otra solución que usa GROUP_CONCAT para que ejecute 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;
Mohamad Hamouday
fuente
1

Descubrí que las declaraciones preparadas eran un poco complicadas para que me funcionaran, pero configurarlas GROUP_CONCAT_MAX_LENera esencial cuando tienes muchas tablas. Esto resultó en un proceso simple de tres pasos con cortar y pegar desde la línea de comando mysql 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, corte y pegue con cuidado la declaración DROP larga resultante .

drchuck
fuente
finalizar la consulta con en \Glugar de ;da un resultado un poco más limpio
Stuart Cardall