2011-01-21 5 views
2

Есть ли способ обрезать все таблицы из определенного имени базы данных MySQL без использования каких-либо других языков, кроме SQL? Я имею в виду никаких сценариев оболочки Linux. (почему? потому что он будет работать на окнах, MacOSX и Linux-серверах).Как я могу обрезать все таблицы из базы данных MySQL?

проблема заключается в том, что клиент выбирает имя базы данных из списка на веб-странице панели управления (которая будет отображать базы данных MySQL с разных серверов * nix и windows), а затем он захочет обрезать все таблицы внутри эта база данных (да, это главная задача веб-формы).

Alex

ответ

2

Хорошо, я решил это сам здесь хранимая процедура :)

BEGIN 
    DECLARE done BOOLEAN DEFAULT FALSE; 
    DECLARE truncatestmnt TEXT; -- this is where the truncate statement will be retrieved from cursor 

    -- This is the magic query that will bring all the table names from the database 
    DECLARE c1 CURSOR FOR SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = "@DatabaseName"; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE; 

    OPEN c1; 

    c1_loop: LOOP 
    FETCH c1 INTO truncatestmnt; 
    IF `done` THEN LEAVE c1_loop; END IF; 
     SET @x = truncatestmnt; 
     PREPARE stm1 FROM @x; 
     EXECUTE stm1; 
    END LOOP c1_loop; 

    CLOSE c1; 
END 

То, что я делаю свое призвание все таблицы из данной базы данных это поможет, если таблицы внутри данной базы данных не имеют шаблонов.

Так, вызвав DECLARE c1 CURSOR FOR SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = "@DatabaseName"; и сохранение результатов в курсор можно извлечь все TRUNCATE TABLE x заявления, порожденные «п» количество таблиц в данной базе данных, затем просто подготовка и выполнение каждого оператора в курсоре будет укоротить все таблицы внутри данной базы данных.

BTW @DatabaseName должен быть передан как параметр хранимой процедуры

Надеется, что это помогает кто-то другое тоже :)

Alex

+1

Проблема, которую я вижу, заключается в том, что она не будет обрабатывать отношения внешних ключей. Поэтому при попытке обрезания таблицы, на которую ссылается другая таблица, она не сработает. –

+0

Вы абсолютно правы, любые идеи о том, как с ними справиться? – dalexsoto

+0

Единственный способ, с помощью которого можно было бы удалить ограничения и воссоздать их все после TRUNCATE – dalexsoto

0
create procedure drop_tables_like(pattern varchar(255), db varchar(255)) 
begin 
select @str_sql:=concat('drop table ', group_concat(table_name)) 
from information_schema.tables 
where table_schema=db and table_name like pattern; 

prepare stmt from @str_sql; 
execute stmt; 
drop prepare stmt; 
end 

затем вызвать

call drop_tables_like('%', 'dababase_name') 
+0

Проблема заключается в том, что если клиент создает таблицу без те же шаблоны, которые это не помогут: tblCust, tblProducts, custProducts – dalexsoto

Смежные вопросы