mysql - SQL: eliminación de tablas con prefijo
phpmyadmin sql-drop (10)
¿Cómo eliminar mis tablas que tienen el prefijo myprefix_
?
Nota: necesita ejecutarlo en phpMyAdmin
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 comenzando 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.
Dejo caer la tabla con éxito al editar la consulta para que me guste
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;
Descubrí que las declaraciones preparadas fueron un poco complicadas para trabajar conmigo, pero configurar GROUP_CONCAT_MAX_LEN
fue esencial cuando tienes muchas tablas. Esto resultó en un proceso simple de tres pasos con cortar y pegar de la línea de comandos de 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_%'';
A continuación, corte y pegue cuidadosamente la declaración de DROP larga resultante.
No puede hacerlo con un solo comando MySQL, sin embargo, puede usar MySQL para construir la declaración para usted:
En el shell de MySQL o a través de 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 arriba soltará 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 propio nombre de base de datos:
SELECT CONCAT( ''DROP TABLE '', GROUP_CONCAT(table_name) , '';'' )
AS statement FROM information_schema.tables
WHERE table_schema = ''database_name'' AND table_name LIKE ''myprefix_%'';
Puedes hacerlo en un comando con MySQL:
drop table myprefix_1, myprefix_2, myprefix_3;
Sin embargo, probablemente tendrá que compilar dinámicamente la lista de tablas en el código.
Un enfoque alternativo sería usar la biblioteca de rutina de propósito general para MySQL 5.
Solo otra solución usando GROUP_CONCAT para que ejecute una consulta de drop 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;
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;
@andre-miller solución @andre-miller es buena, pero hay una mejor y un poco más profesional que te ayudará a ejecutarla 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 depende de la plataforma, es para MySQL, pero seguro que podría implementarse para Postgre, Oracle y MS SQL con ligeros cambios.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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 reemplaza para eliminar el formato no deseado y reemplazar /n
con una coma ;
en el extremo y agregue la tabla para colocar al frente.
Obtendrás algo que se ve así:
drop table myprefix_1, myprefix_2, myprefix_3;