SQL: Löschen von Tabellen mit Präfix

101

Wie lösche ich meine Tabellen, die alle das Präfix haben myprefix_?

Hinweis: Sie müssen es in phpMyAdmin ausführen

Deniz Zoeteman
quelle

Antworten:

178

Sie können dies nicht mit nur einem einzigen MySQL-Befehl tun. Sie können jedoch MySQL verwenden, um die Anweisung für Sie zu erstellen:

Verwenden Sie in der MySQL-Shell oder über PHPMyAdmin die folgende Abfrage

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Dadurch wird eine DROP-Anweisung generiert, die Sie kopieren und ausführen können, um die Tabellen zu löschen.

EDIT: Ein Haftungsausschluss hier - die oben generierte Anweisung löscht alle Tabellen in allen Datenbanken mit diesem Präfix. Wenn Sie es auf eine bestimmte Datenbank beschränken möchten, ändern Sie die Abfrage so, dass sie so aussieht, und ersetzen Sie den Datenbanknamen durch Ihren eigenen Datenbanknamen:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
Andre Miller
quelle
Ich habe nur eine Datenbank, daher brauche ich die zweite nicht.
Deniz Zoeteman
4
@ElijahLynn Die Grenzwertquelle ist wahrscheinlich auf die maximale Länge von GROUP_CONCAT zurückzuführen. Sie können es vergrößern, siehe zum Beispiel hier
Asaf David
7
Hinweis für sich selbst. Erhöhen Sie die Anzahl der maximalen Zeichen
Mohammed Joraid
2
Bitte beachten Sie, dass es in einigen Fällen notwendig ist, Unterstriche in Tabellenpräfixnamen zu [...] LIKE 'myprefix\_%';
umgehen
1
Dies gibt zahlreiche doppelte Tabellennamen zurück. Die Antwort, die Pankaj Khurana gepostet hat, funktioniert meiner Meinung nach besser.
Jeremy
37

Einige der früheren Antworten waren sehr gut. Ich habe ihre Ideen mit einigen Begriffen aus anderen Antworten im Web zusammengetragen.

Ich musste alle Tabellen löschen, die mit 'temp_' beginnen. Nach einigen Iterationen kam ich auf diesen Codeblock:

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Ich hoffe, dass dies für andere MySQL / PHP-Programmierer nützlich ist.

Bradley Slavik
quelle
1
Das ist genau die richtige Antwort. Andere Antworten verwenden mehrere Schritte oder erfordern eine manuelle Ausführung. Ich weiß nicht, wie diese Antwort nach 4 Jahren keine Stimmen mehr hat!
gbe
25
show tables like 'prefix_%';

Kopieren Sie die Ergebnisse und fügen Sie sie in einen Texteditor ein oder geben Sie die Abfrage in eine Datei aus. Verwenden Sie einige Such- und Ersetzungsfunktionen, um unerwünschte Formatierungen zu entfernen, und ersetzen Sie sie \ndurch ein Komma ;am Ende und fügen Sie eine Drop-Tabelle an der Vorderseite hinzu.

Sie erhalten etwas, das so aussieht:

drop table myprefix_1, myprefix_2, myprefix_3;
Daniel
quelle
1
Ich hatte keinen Zugriff auf information_schema.tables auf dem Webhost, den ich verwende. Dies war also der richtige Weg, danke!
Florent Roques
10

Die @ andre-miller- Lösung ist gut, aber es gibt noch bessere und etwas professionellere, mit denen Sie alles auf einmal ausführen können. Es wird immer noch mehr als einen Befehl benötigt, aber mit dieser Lösung können Sie SQL für automatisierte Builds verwenden.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

Hinweis: Dieser Code ist plattformabhängig, er ist für MySQL, kann aber mit geringfügigen Änderungen sicher für Postgre, Oracle und MS SQL implementiert werden.

Alex Rashkov
quelle
FEHLER 1064 (42000): In Ihrer SQL-Syntax ist ein Fehler aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von '@tbls' in Zeile 1. FEHLER 1243 (HY000): Unbekannter vorbereiteter Anweisungshandler (stmt) für EXECUTE ERROR 1243 (HY000): Unbekannter vorbereiteter Anweisungshandler (stmt) zu DEALLOCATE PREPARE gegeben
Roni Tovi
Syntaxfehler bei: PREPARE stmt FROM 'DROP TABLE @tbls';
Ledawg
5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
Pankaj Khurana
quelle
3

Ich lösche die Tabelle erfolgreich durch Bearbeiten der Abfrage, um dies zu mögen

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Duong Vo
quelle
Dies war die einzige, die ich gefunden habe und die die gesamte Operation in einem einzigen Schritt durchgeführt hat, während Fremdschlüsseleinschränkungen behandelt wurden.
Evan Mattson
2

Mit MySQL können Sie dies in einem Befehl tun:

drop table myprefix_1, myprefix_2, myprefix_3;

Wahrscheinlich müssen Sie die Tabellenliste jedoch dynamisch im Code erstellen.

Ein alternativer Ansatz wäre die Verwendung der Allzweck-Routinebibliothek für MySQL 5.

Asaph
quelle
2

Ich wollte nur genau das SQL posten, das ich verwendet habe - es ist eine Mischung aus den Top-3-Antworten:

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Danny Beckett
quelle
2

Nur eine andere Lösung, die GROUP_CONCAT verwendet, damit eine Drop-Abfrage wie
DROP TABLE table1, table2, .. ausgeführt wird.

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;
Mohamad Hamouday
quelle
1

Ich fand, dass die vorbereiteten Aussagen etwas schwierig waren, um für mich zu arbeiten, aber das Festlegen der GROUP_CONCAT_MAX_LENwar wichtig, wenn Sie viele Tabellen haben. Dies führte zu einem einfachen dreistufigen Prozess mit Ausschneiden und Einfügen über die MySQL- Befehlszeile, der für mich hervorragend funktionierte:

SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Schneiden Sie dann die resultierende lange DROP- Anweisung vorsichtig aus und fügen Sie sie ein .

drchuck
quelle
Das Beenden der Abfrage mit \Gstatt ;ergibt eine etwas sauberere Ausgabe
Stuart Cardall