2010-11-18 10 views
1

Ich habe eine MySQL-Datenbank, die viele Tabellen enthält, von denen einige dynamisch von der Software erstellt wurden. Die dynamischen Tabellen haben ein konsistentes Benennungsschema:Löschen dynamisch verwalteter Tabellen in MySQL

dynamic_1 
dynamic_2 
... 

Allerdings weiß ich nicht unbedingt, wie viele dieser Tabellen es gibt.

Ich möchte in der Lage sein, alle diese dynamischen Tabellen zu löschen, ohne die gesamte Datenbank zu löschen. Ich möchte das gerne rein in SQL machen. (Gespeicherte Prozeduren sind ok.) Ist das überhaupt möglich?


Schnellzusatz.

Die Lösung von Haim und Alexandre funktioniert großartig, aber es gibt einen speziellen Fall, den wir alle verpasst haben. Was ist, wenn es keine dynamischen Tabellen gibt? In diesem Fall wird @v NULL sein und wir erhalten einen Fehler, wenn wir versuchen auszuführen. Ich habe eine zweite Variable hinzugefügt, um diesen Fall zu behandeln:

Antwort

3

Sie können diese Abfrage ausführen und alle SQL-Abfragen abrufen, die Sie ausführen müssen;

select concat('drop table ', a.table_name, ';') 
from information_schema.tables a 
where a.table_name like 'dynamic_%'; 

können Sie es einfügen wie

INTO OUTFILE '/tmp/delete.sql'; 

Update-Datei nach alexandre Kommentar

SET @v = (select concat('drop table ', group_concat(a.table_name)) 
    from information_schema.tables a 
    where a.table_name like 'dynamic_%' 
    AND a.table_schema = DATABASE() 
;); 
PREPARE s FROM @v; 
EXECUTE s; 
+0

Sie sollten wahrscheinlich hinzufügen 'UND a.table_schema = DATABASE()' suchen nur die aktuelle Datenbank –

+0

Wow, das sieht gut aus. (Und ja, das a.table_schema ist nützlich.) Ist es möglich, die Ergebnismenge einer Variablen zuzuweisen und sie im selben Skript auszuführen? – njudge

+0

Ich denke, Sie können es nur in der gespeicherten Prozedur mit Schleife –