Проблема в том, что если клиент создает таблицы без одинаковых шаблонов, это не поможет, например: tblCust, tblProducts, custProducts.

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

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

КСТАТИ @DatabaseName должно быть указано в качестве параметра для хранимой процедуры

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

Alex

 dalexsoto21 янв. 2011 г., 10:40
SET FOREIGN_KEY_CHECKS = 0; Покажи фокус????
 21 янв. 2011 г., 10:00
Вы абсолютно правы, есть идеи, как с ними справиться?
 dalexsoto21 янв. 2011 г., 10:03
Единственный способ избежать этого - это удалить ограничения и воссоздать их все после TRUNCATE.
 a_horse_with_no_name21 янв. 2011 г., 10:08
Поскольку в MySQL нет способа временно отключить ограничение, это также единственное решение, которое я вижу (или проанализировать отношение FK, а затем выполнить усечение в правильном порядке, но это довольно сложно)
 a_horse_with_no_name21 янв. 2011 г., 09:36
Проблема, которую я вижу, состоит в том, что она не будет обрабатывать отношения внешнего ключа. Таким образом, произойдет сбой при попытке обрезать таблицу, на которую ссылается другая таблица.
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')
 dalexsoto21 янв. 2011 г., 09:00
Проблема в том, что если клиент создает таблицы без одинаковых шаблонов, это не поможет, например: tblCust, tblProducts, custProducts.

Ваш ответ на вопрос