Wie lösche ich meine Tabellen, die alle das Präfix haben myprefix_
?
Hinweis: Sie müssen es in phpMyAdmin ausführen
Wie lösche ich meine Tabellen, die alle das Präfix haben myprefix_
?
Hinweis: Sie müssen es in phpMyAdmin ausführen
Antworten:
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_%';
[...] LIKE 'myprefix\_%';
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.
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 \n
durch 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;
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.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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.
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;
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;
Ich fand, dass die vorbereiteten Aussagen etwas schwierig waren, um für mich zu arbeiten, aber das Festlegen der GROUP_CONCAT_MAX_LEN
war 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 .
\G
statt ;
ergibt eine etwas sauberere Ausgabe