Как я могу обрезать все таблицы из базы данных MySQL? - PullRequest
2 голосов
/ 21 января 2011

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

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

Alex

Ответы [ 2 ]

2 голосов
/ 21 января 2011

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

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, сгенерированные количеством n таблиц в данной базе данных, затем просто подготовить и выполнить каждый оператор в курсоре будет обрезать все таблицы в данной базе данных.

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

Надеюсь, это поможет кому-то еще:)

Alex

0 голосов
/ 21 января 2011
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')
...