Avatar billede psychopixi Nybegynder
12. februar 2009 - 21:03 Der er 9 kommentarer og
1 løsning

Drop multiple tables

Hej eksperter,
Jeg vil gerne lave en MySQL forespørgsel der sletter alle tables med et bestemt prefix.

Alstå noget i retningen af:
DROP TABLE WHERE TABLE LIKE 'prefix_%'

Det er ingen hemlighed at ovenstående overhovedet ikke en valid MySQL query. Jeg har rodet lidt med at få det til at fungere med subqueries, men kan ikke få det til at virke.

Er der nogen her der har et forslag til, hvordan det kan løses? Eller skal det tages PHP-vejen, som fx:

<?php
$query = "SHOW TABLES LIKE 'prefix_%'";
$result = mysql_query($query);
while($r=mysql_fetch_array($result)){
    mysql_query("DROP TABLE ".$r[0]."");
}
?>
Avatar billede arne_v Ekspert
12. februar 2009 - 21:22 #1
Jeg kan ikke se noget problem med PHP loesningen.

Du kunne lave det samme i en MySQL SP.

Men det er ikke bedre end at lave det i PHP.
Avatar billede psychopixi Nybegynder
12. februar 2009 - 21:34 #2
Nej, tror gerne at det ikke er bedre, men det må kunne samle funktionen på en linie, og dermed gøre den mere overskuelig?
Har du en ide til hvordan man gør det med en SP?
Avatar billede arne_v Ekspert
12. februar 2009 - 21:52 #3
Jeg sidder ikke ved en MySQL 5.x lige nu, saa derfor utestet:

DELIMITER //
CREATE PROCEDURE droptables(_prefix VARCHAR(10), _db VARCHAR(255))
BEGIN
    DECLARE done INTEGER;
    DECLARE tblnam VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=_db AND TABLE_TYPE='Base table' AND TABLE_NAME LIKE CONCAT(_prefix, '%');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    SET done = 0;
    REPEAT
        FETCH cur INTO tblnam;
        SET @sql = CONCAT('DROP TABLE ', tblnam);
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    UNTIL done END REPEAT;
END//
DELIMITER ;
Avatar billede arne_v Ekspert
12. februar 2009 - 21:53 #4
Og jeg behoever vel ikke sige at det er en SP man skal vaere lidt forsigtig med at teste.

:-)

Jeg vil anbefale at teste med noget andet end DROP TABLE.
Avatar billede psychopixi Nybegynder
12. februar 2009 - 21:58 #5
Tak Arne, men det står da klart nu at det ikke bliver en pænere kode:)

Jeg havde jo troet at man kunne gøre noget i retningen af:
"DROP TABLE (SHOW TABLES LIKE 'phpbb_%')"

Men jeg siger tak for hjælpen, og smid et svar hvis du vil have point:)
Avatar billede arne_v Ekspert
13. februar 2009 - 03:26 #6
Følgende lettere modficerede version ser ud til at virke:

DELIMITER //
CREATE PROCEDURE droptables(_prefix VARCHAR(10), _db VARCHAR(255))
BEGIN
    DECLARE done INTEGER;
    DECLARE tblnam VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=_db AND TABLE_TYPE='Base table' AND TABLE_NAME LIKE CONCAT(_prefix, '%');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    SET done = 0;
    REPEAT
        FETCH cur INTO tblnam;
        IF NOT done THEN
            -- SET @sql = CONCAT('DROP TABLE ', tblnam);
            SET @sql = CONCAT('SELECT * FROM ', tblnam);
            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
        END IF;
    UNTIL done END REPEAT;
    CLOSE cur;
END//
DELIMITER ;
Avatar billede arne_v Ekspert
13. februar 2009 - 03:26 #7
SQL'en til at kalde den med ser du som f.eks.:

CALL droptables('T', 'Test');
Avatar billede arne_v Ekspert
13. februar 2009 - 03:28 #8
Fordelen er at denne SP kan kalde fra mange PHP scripts, fra Java, fra .NET, fra C++ etc.

Men jeg ville stadig lave det i app, fordi det er ikke en operation som egner sig til det store genbrug.
Avatar billede arne_v Ekspert
13. februar 2009 - 03:28 #9
Og et svar.
Avatar billede psychopixi Nybegynder
13. februar 2009 - 10:53 #10
Tak for kommentar og kode:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester