12. februar 2009 - 21:03Der 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:
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?
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 ;
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 ;
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.