Я обновил свой ответ, чтобы выполнить удаление таблиц без использования хранимой процедуры. Попробуйте!
RolandoMySQLDBA
Ответы:
11
Вот хранимая процедура, которая принимает базу данных и строку префикса в качестве параметров:
DELIMITER $$DROPPROCEDURE DropTablesWithPrefix $$CREATEPROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGINDECLARE ndx,maxidx INT;DECLARE giventable,SQLSTMT VARCHAR(500);CREATETABLE TableZapList
(
droptablesql VARCHAR(512),
idx INT NOTNULL AUTO_INCREMENT PRIMARYKEY) ENGINE=MyISAM;INSERTINTO 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 =0THEN
LEAVE StoredProcedure;ENDIF;<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;ENDWHILE;<BR>SELECT droptablesql FROM TableZapList;DROPTABLE 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) команды:
Скрипт Rolandos работает, но может потребоваться увеличить параметр group_concat_max_len, если у вас много таблиц или очень длинные имена таблиц: SET SESSION group_concat_max_len = 1000000;
JohnP
Вместо того, чтобы менять group + concat_max_len, я использовал подзапрос с лимитом и выполнял пошаговое
отбрасывание
SUBSTRУсловие в INSERTдолжно быть: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxто он работает отлично.
Лоран
8
Во-первых, сгенерируйте скрипт для этого в приглашении 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>командной строке.
я уже сделал скрипт php helper для этого, однако мне было интересно, если это можно сделать с помощью одного запроса.
poelinca
1
Простой ответ: Нет. Сложный ответ: Да, если вы поместите его в хранимую процедуру . Таким образом, вы можете выполнить это в одной команде, но это будет то же самое, что вызов скрипта.
Гай
4
Вам следует запросить системные имена для этих имен таблиц и построить строку для ее динамического выполнения. В 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.
Я читаю ваш ответ очень внимательно. Это синоним моего ответа. Хотя на диалекте SQL Server ваш ответ, в принципе, является первым правильным ответом. +1 !!!
RolandoMySQLDBA
3
Чтобы ответить на ваш вопрос, нет. Не в 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
Ответы:
Вот хранимая процедура, которая принимает базу данных и строку префикса в качестве параметров:
ОБНОВЛЕНИЕ 2011-07-12 14:55 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Я просто подумал о более чистом, упрощенном способе. Вместо использования хранимой процедуры просто используйте функцию GROUP_CONCAT, чтобы собрать все таблицы в zap. Затем составьте в один запрос:
Вот запрос для удаления всех таблиц, которые начинаются с wp_pol в текущей базе данных:
Следующее, что нужно сделать, это сохранить результат в
Последнее, что нужно выполнить динамический SQL, используя эти три (3) команды:
Вот демонстрация использования MySQL 5.5.12 в Windows, которая работает:
Попробуйте!
источник
SUBSTR
Условие вINSERT
должно быть:SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
то он работает отлично.Во-первых, сгенерируйте скрипт для этого в приглашении Unix:
Замени префикс своим. Эта
--batch
опция подавляет необычное форматирование, которое MySQL делает по умолчанию, поэтому вы можете создать исполняемый скрипт SQL.Просмотрите сценарий и, если он выглядит нормально, запустите
drop.sql
вmysql>
командной строке.источник
Вам следует запросить системные имена для этих имен таблиц и построить строку для ее динамического выполнения. В SQL Server я бы сделал что-то вроде:
Теперь вам нужно найти соответствующую системную таблицу в MySQL.
источник
Чтобы ответить на ваш вопрос, нет. Не в MySQL, используя одну команду / запрос. Вам придется цеплять команды.
Однако, если вы хотите достичь своей цели, вот один из способов:
Из скрипта bash что-то вроде:
Затем просмотрите файл drop.sql. Если все хорошо, сделайте BACKUP , тогда ...
источник
Вы всегда можете использовать АДМИНИСТРАТОР БАЗЫ ДАННЫХ, например navicat, и такие проблемы исчезнут при простом выборе и удалении.
источник