MySQL: DROP TABLE Comenzando con un prefijo

8

EJEMPLO: Tengo más de 30 tablas que comienzan con un prefijo "dp_" y unas 12 que comienzan con "ex_".

PREGUNTA: ¿Cómo puedo descartar todas las tablas que comienzan con "dp_" en una consulta?

poelinca
fuente
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 $$

DROP PROCEDURE DropTablesWithPrefix $$
CREATE PROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGIN
    DECLARE ndx,maxidx INT;
    DECLARE giventable,SQLSTMT VARCHAR(500);

    CREATE TABLE TableZapList
    (
        droptablesql VARCHAR(512),
        idx INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ) ENGINE=MyISAM;

    INSERT INTO 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 = 0 THEN
        LEAVE StoredProcedure;
    END IF;<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;
    END WHILE;<BR>

    SELECT droptablesql FROM TableZapList;
    DROP TABLE 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:

PREPARE s1 FROM @dropcmd;
EXECUTE s1;
DEALLOCATE PREPARE s1;

Aquí hay una demostración usando MySQL 5.5.12 en Windows que funciona:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.12 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

MySQL (Current test) :: use garbage
Database changed
MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_pollsa                    |
| wp_pollsip                   |
| wp_pollsq                    |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
21 rows in set (0.00 sec)

MySQL (Current garbage) :: 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%';
Query OK, 1 row affected (0.00 sec)

MySQL (Current garbage) :: SELECT @dropcmd;
+--------------------------------------------------------------------+
| @dropcmd                                                           |
+--------------------------------------------------------------------+
| DROP TABLE garbage.wp_pollsa,garbage.wp_pollsip,garbage.wp_pollsq; |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL (Current garbage) :: PREPARE s1 FROM @dropcmd; EXECUTE s1; DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
18 rows in set (0.00 sec)

MySQL (Current garbage) ::

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
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.

Gayo
fuente
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.

Mariana
fuente
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
randomx
fuente
1

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.

Néstor González
fuente