ПРИМЕР: у меня есть более 30 таблиц, начинающихся с префикса "dp_" и около 12, начинающихся с "ex_".
ВОПРОС: Как я могу удалить все таблицы, начинающиеся с "dp_" в одном запросе?
ПРИМЕР: у меня есть более 30 таблиц, начинающихся с префикса "dp_" и около 12, начинающихся с "ex_".
ВОПРОС: Как я могу удалить все таблицы, начинающиеся с "dp_" в одном запросе?
Ответы:
Вот хранимая процедура, которая принимает базу данных и строку префикса в качестве параметров:
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 ;
ОБНОВЛЕНИЕ 2011-07-12 14:55 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Я просто подумал о более чистом, упрощенном способе. Вместо использования хранимой процедуры просто используйте функцию GROUP_CONCAT, чтобы собрать все таблицы в zap. Затем составьте в один запрос:
Вот запрос для удаления всех таблиц, которые начинаются с wp_pol в текущей базе данных:
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%';
Следующее, что нужно сделать, это сохранить результат в
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%';
Последнее, что нужно выполнить динамический SQL, используя эти три (3) команды:
PREPARE s1 FROM @dropcmd;
EXECUTE s1;
DEALLOCATE PREPARE s1;
Вот демонстрация использования MySQL 5.5.12 в Windows, которая работает:
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) ::
Попробуйте!
SUBSTR
Условие в INSERT
должно быть: SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
то он работает отлично.
Во-первых, сгенерируйте скрипт для этого в приглашении 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
Замени префикс своим. Эта --batch
опция подавляет необычное форматирование, которое MySQL делает по умолчанию, поэтому вы можете создать исполняемый скрипт SQL.
Просмотрите сценарий и, если он выглядит нормально, запустите drop.sql
в mysql>
командной строке.
Вам следует запросить системные имена для этих имен таблиц и построить строку для ее динамического выполнения. В SQL Server я бы сделал что-то вроде:
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);
Теперь вам нужно найти соответствующую системную таблицу в MySQL.
Чтобы ответить на ваш вопрос, нет. Не в MySQL, используя одну команду / запрос. Вам придется цеплять команды.
Однако, если вы хотите достичь своей цели, вот один из способов:
Из скрипта bash что-то вроде:
#/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
Затем просмотрите файл drop.sql. Если все хорошо, сделайте BACKUP , тогда ...
mysql -u username -p -v --show-warnings < drops.sql
Вы всегда можете использовать АДМИНИСТРАТОР БАЗЫ ДАННЫХ, например navicat, и такие проблемы исчезнут при простом выборе и удалении.