MySQL: DROP TABLE Beginnend mit einem Präfix


8

BEISPIEL: Ich habe mehr als 30 Tabellen, die mit dem Präfix "dp_" beginnen, und ungefähr 12, die mit "ex_" beginnen.

FRAGE: Wie kann ich alle Tabellen, die mit "dp_" beginnen, in einer Abfrage löschen?


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 $$

DROP PROCEDURE DropTablesWithPrefix $$
CREATE PROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGIN
    DECLARE ndx,maxidx INT;
    DECLARE giventable,SQLSTMT VARCHAR(500);

    CREATE TABLE TableZapList
    (
        droptablesql VARCHAR(512),
        idx INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ) ENGINE=MyISAM;

    INSERT INTO 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 = 0 THEN
        LEAVE StoredProcedure;
    END IF;<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;
    END WHILE;<BR>

    SELECT droptablesql FROM TableZapList;
    DROP TABLE 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:

PREPARE s1 FROM @dropcmd;
EXECUTE s1;
DEALLOCATE PREPARE s1;

Hier ist eine Demonstration mit MySQL 5.5.12 unter Windows, die funktioniert:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.12 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

MySQL (Current test) :: use garbage
Database changed
MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_pollsa                    |
| wp_pollsip                   |
| wp_pollsq                    |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
21 rows in set (0.00 sec)

MySQL (Current garbage) :: 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%';
Query OK, 1 row affected (0.00 sec)

MySQL (Current garbage) :: SELECT @dropcmd;
+--------------------------------------------------------------------+
| @dropcmd                                                           |
+--------------------------------------------------------------------+
| DROP TABLE garbage.wp_pollsa,garbage.wp_pollsip,garbage.wp_pollsq; |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL (Current garbage) :: PREPARE s1 FROM @dropcmd; EXECUTE s1; DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
18 rows in set (0.00 sec)

MySQL (Current garbage) ::

Versuche es !!!


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

1

Sie können immer einen DATABASE ADMINISTRATOR wie navicat verwenden, und diese Art von Problemen wird durch einfaches Auswählen und Löschen verschwinden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.