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?
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?
Respuestas:
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 !!!
SUBSTR
condición en el INSERT
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:
$ 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 --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 el mysql>
indicador.
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.
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
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.