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

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

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

Алекс


person dalexsoto    schedule 21.01.2011    source источник


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

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

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

Алекс

person dalexsoto    schedule 21.01.2011
comment
Проблема, которую я вижу, заключается в том, что он не будет обрабатывать отношения внешнего ключа. Таким образом, при попытке усечь таблицу, на которую ссылается другая таблица, произойдет сбой. - person a_horse_with_no_name; 21.01.2011
comment
Единственным способом в этом случае было бы удалить ограничения и воссоздать их все после TRUNCATE. - person dalexsoto; 21.01.2011
comment
Поскольку у MySQL нет способа временно отключить ограничение, это единственное решение, которое я вижу (или проанализировать отношения FK, а затем выполнить усечение в правильном порядке, но это довольно сложно) - person a_horse_with_no_name; 21.01.2011
comment
Я поработаю над этим завтра и опубликую измененную процедуру хранения, которая обрабатывает FK :) - person dalexsoto; 21.01.2011
comment
Как вызвать эту процедуру с параметром? - person Lenin Raj Rajasekaran; 28.08.2012

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')
person Carlos Mora    schedule 21.01.2011
comment
Проблема в том, что если клиент создает таблицы без одинаковых шаблонов, это не поможет, например: tblCust, tblProducts, custProducts - person dalexsoto; 21.01.2011