Ich habe meine Antwort aktualisiert, um das Löschen der Tabellen ohne Verwendung einer gespeicherten Prozedur durchzuführen. Versuche es !!!
RolandoMySQLDBA
Antworten:
11
Hier ist eine gespeicherte Prozedur, die die Datenbank und die Präfixzeichenfolge als Parameter akzeptiert:
DELIMITER $$DROPPROCEDURE DropTablesWithPrefix $$CREATEPROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGINDECLARE ndx,maxidx INT;DECLARE giventable,SQLSTMT VARCHAR(500);CREATETABLE TableZapList
(
droptablesql VARCHAR(512),
idx INT NOTNULL AUTO_INCREMENT PRIMARYKEY) ENGINE=MyISAM;INSERTINTO TableZapList (droptablesql)SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)FROM information_schema.tables
WHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx))= prfx;SELECT COUNT(1)INTO maxid FROM TableZapList;IF maxid =0THEN
LEAVE StoredProcedure;ENDIF;<BR>SET ndx =0;WHILE ndx < maxid DO
SET ndx = ndx +1;SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;SET@sql = SQLSTMT;
PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;ENDWHILE;<BR>SELECT droptablesql FROM TableZapList;DROPTABLE TableZapList;END;
DELIMITER ;
UPDATE 2011-07-12 14:55 EDT
Ich dachte nur an einen saubereren, einfacheren Weg. Anstatt eine gespeicherte Prozedur zu verwenden, verwenden Sie einfach die Funktion GROUP_CONCAT, um alle zu zapenden Tabellen zu sammeln. Verfassen Sie dann zu einer einzigen Abfrage:
Hier ist eine Abfrage zum Löschen aller Tabellen, die mit wp_pol beginnen, in der aktuellen Datenbank:
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')FROM information_schema.tables
WHERE table_schema=database()AND table_name like'wp_pol%';
Als nächstes speichern Sie das Ergebnis in
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')INTO@dropcmd
FROM information_schema.tables
WHERE table_schema=database()AND table_name like'wp_pol%';
Als letztes müssen Sie das dynamische SQL mit diesen drei (3) Befehlen ausführen:
Das Rolandos-Skript funktioniert, aber möglicherweise muss der Parameter group_concat_max_len erhöht werden, wenn Sie viele Tabellen oder sehr lange Tabellennamen haben: SET SESSION group_concat_max_len = 1000000;
JohnP
Anstatt group + concat_max_len zu ändern, habe ich eine Unterabfrage mit einem Limit verwendet und die Drops in Schritten ausgeführt
pedromanoel
Die SUBSTRBedingung in der INSERTsollte sein: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxdann funktioniert es gut.
Laurent
8
Generieren Sie zunächst an der Unix-Eingabeaufforderung ein Skript, um dies zu tun:
$ echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';"|mysql --user=root --password=blah --batch >drop.sql
Ersetzen Sie das Präfix durch Ihr eigenes. Die --batchOption unterdrückt die ausgefallene Formatierung, die MySQL standardmäßig ausführt, sodass Sie ein ausführbares SQL-Skript erstellen können.
Überprüfen Sie das Skript und führen Sie es drop.sqlan der mysql>Eingabeaufforderung aus, wenn es in Ordnung aussieht .
Ich habe bereits ein PHP-Hilfsskript erstellt, um dies zu tun, aber ich habe mich gefragt, ob es mit einer einzigen Abfrage durchgeführt werden kann.
Poelinca
1
Einfache Antwort: Nein. Komplexe Antwort: Ja, wenn Sie sie in eine gespeicherte Prozedur einschließen . Sie könnten es also in einem Befehl ausführen, aber es wäre dasselbe wie das Aufrufen eines Skripts.
Gaius
4
Sie sollten die Systemtabellen nach diesen Tabellennamen abfragen und eine Zeichenfolge erstellen, um sie dynamisch auszuführen. In SQL Server würde ich so etwas tun:
declare@x varchar(max),@enter char(2);select@x ='',@enter = char(13)+char(10);Select@x =@x +'drop table '+ table_name +';'+@enter
from information_schema.tables
where table_name like'%accounting%'print@x
execute(@x);
Jetzt müssen Sie die entsprechende Systemtabelle in MySQL finden.
Ich habe Ihre Antwort sehr sorgfältig gelesen. Dies ist gleichbedeutend mit meiner Antwort. Obwohl im SQL Server-Dialekt, ist Ihre Antwort im Prinzip die erste richtige Antwort. +1 !!!
RolandoMySQLDBA
3
Um Ihre Frage zu beantworten, nein. Nicht in MySQL mit einem einzigen Befehl / einer einzigen Abfrage. Sie müssen Befehle verketten.
Wenn Sie jedoch Ihr Ziel erreichen möchten, haben Sie folgende Möglichkeiten:
Aus einem Bash-Skript so etwas wie:
#/bin/bash
TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'"-u user-p`for i in$TABLES;
do
echo "DROP TABLE $i;">> drops.sql ;
done
cat drops.sql
Überprüfen Sie dann die Datei drops.sql. Wenn alles gut ist, machen Sie ein Backup , dann ...
mysql -u username -p -v --show-warnings < drops.sql
Sie können immer einen DATABASE ADMINISTRATOR wie navicat verwenden, und diese Art von Problemen wird durch einfaches Auswählen und Löschen verschwinden.
Antworten:
Hier ist eine gespeicherte Prozedur, die die Datenbank und die Präfixzeichenfolge als Parameter akzeptiert:
UPDATE 2011-07-12 14:55 EDT
Ich dachte nur an einen saubereren, einfacheren Weg. Anstatt eine gespeicherte Prozedur zu verwenden, verwenden Sie einfach die Funktion GROUP_CONCAT, um alle zu zapenden Tabellen zu sammeln. Verfassen Sie dann zu einer einzigen Abfrage:
Hier ist eine Abfrage zum Löschen aller Tabellen, die mit wp_pol beginnen, in der aktuellen Datenbank:
Als nächstes speichern Sie das Ergebnis in
Als letztes müssen Sie das dynamische SQL mit diesen drei (3) Befehlen ausführen:
Hier ist eine Demonstration mit MySQL 5.5.12 unter Windows, die funktioniert:
Versuche es !!!
quelle
SUBSTR
Bedingung in derINSERT
sollte sein:SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
dann funktioniert es gut.Generieren Sie zunächst an der Unix-Eingabeaufforderung ein Skript, um dies zu tun:
Ersetzen Sie das Präfix durch Ihr eigenes. Die
--batch
Option unterdrückt die ausgefallene Formatierung, die MySQL standardmäßig ausführt, sodass Sie ein ausführbares SQL-Skript erstellen können.Überprüfen Sie das Skript und führen Sie es
drop.sql
an dermysql>
Eingabeaufforderung aus, wenn es in Ordnung aussieht .quelle
Sie sollten die Systemtabellen nach diesen Tabellennamen abfragen und eine Zeichenfolge erstellen, um sie dynamisch auszuführen. In SQL Server würde ich so etwas tun:
Jetzt müssen Sie die entsprechende Systemtabelle in MySQL finden.
quelle
Um Ihre Frage zu beantworten, nein. Nicht in MySQL mit einem einzigen Befehl / einer einzigen Abfrage. Sie müssen Befehle verketten.
Wenn Sie jedoch Ihr Ziel erreichen möchten, haben Sie folgende Möglichkeiten:
Aus einem Bash-Skript so etwas wie:
Überprüfen Sie dann die Datei drops.sql. Wenn alles gut ist, machen Sie ein Backup , dann ...
quelle
Sie können immer einen DATABASE ADMINISTRATOR wie navicat verwenden, und diese Art von Problemen wird durch einfaches Auswählen und Löschen verschwinden.
quelle