SQL: usuwanie tabel z prefiksem


Odpowiedzi:


178

Nie możesz tego zrobić za pomocą jednego polecenia MySQL, jednak możesz użyć MySQL do skonstruowania instrukcji za siebie:

W powłoce MySQL lub przez PHPMyAdmin użyj następującego zapytania

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

Spowoduje to wygenerowanie instrukcji DROP, którą można skopiować i wykonać, aby usunąć tabele.

EDYCJA: Zastrzeżenie tutaj - instrukcja wygenerowana powyżej spowoduje usunięcie wszystkich tabel we wszystkich bazach danych z tym prefiksem. Jeśli chcesz ograniczyć to do konkretnej bazy danych, zmodyfikuj zapytanie tak, aby wyglądało tak i zamień nazwę_bazy_danych na własną nazwę_bazy_danych:

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

Mam tylko jedną bazę danych, więc nie potrzebuję drugiej.
Deniz Zoeteman

4
@ElijahLynn źródło limitu wynika prawdopodobnie z maksymalnej długości GROUP_CONCAT. możesz go powiększyć, patrz na przykład tutaj
Asaf David

7
Uwaga do self.Zwiększ liczbę maksymalnych znaków: SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid

2
Należy pamiętać, że w niektórych przypadkach konieczne jest [...] LIKE 'myprefix\_%';
pominięcie znaków

1
Zwraca to wiele zduplikowanych nazw_tabeli. Odpowiedź, którą opublikował Pankaj Khurana, działa lepiej IMHO.
Jeremy

37

Niektóre z wcześniejszych odpowiedzi były bardzo dobre. Połączyłem ich pomysły z niektórymi pojęciami z innych odpowiedzi w Internecie.

Musiałem usunąć wszystkie tabele zaczynające się od `` temp_ '' Po kilku iteracjach wymyśliłem ten blok kodu:

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

Mam nadzieję, że jest to przydatne dla innych programistów MySQL / PHP.


1
To jest dokładnie właściwa odpowiedź. Inne odpowiedzi wymagają kilku kroków lub wymagają ręcznego wykonania. Nie wiem, jak ta odpowiedź nie ma więcej głosów po 4 latach!
gbe

25
show tables like 'prefix_%';

skopiuj wyniki i wklej je do edytora tekstu lub wyślij zapytanie do pliku, użyj kilku wyszukiwań i zamian, aby usunąć niechciane formatowanie i zastąp \nprzecinkiem wstaw a; na końcu i dodaj drop table na początku.

otrzymasz coś, co wygląda tak:

drop table myprefix_1, myprefix_2, myprefix_3;

1
nie mam dostępu do information_schema.tables na hoście, którego używam, więc to była droga, dzięki!
Florent Roques

10

Rozwiązanie @ andre-miller jest dobre, ale jest jeszcze lepsze i nieco bardziej profesjonalne, które pomoże Ci wykonać wszystko za jednym razem. Nadal będzie potrzebować więcej niż jednego polecenia, ale to rozwiązanie pozwoli ci używać SQL do automatycznych kompilacji.

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;

Uwaga: ten kod jest zależny od platformy, jest przeznaczony dla MySQL, ale z pewnością można go zaimplementować dla Postgre, Oracle i MS SQL z niewielkimi zmianami.


BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, aby znaleźć właściwą składnię do użycia w pobliżu '@tbls' w linii 1 ERROR 1243 (HY000): Nieznany program obsługi przygotowanych instrukcji (stmt) przekazany do EXECUTE ERROR 1243 (HY000): Nieznany program obsługi przygotowanych instrukcji (stmt) przekazane DEALLOCATE PREPARE
Roni Tovi

Błąd składni w: 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%";

3

Pomyślnie upuszczam tabelę, edytując zapytanie w ten sposób

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;

To był jedyny, jaki znalazłem, który wykonał całą operację za jednym razem, rozwiązując ograniczenia klucza obcego.
Evan Mattson

2

Możesz to zrobić jednym poleceniem z MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Prawdopodobnie będziesz musiał jednak dynamicznie zbudować listę tabel w kodzie.

Alternatywnym podejściem byłoby użycie biblioteki procedur ogólnego przeznaczenia dla MySQL 5.


2

Chciałem tylko opublikować dokładny SQL, którego użyłem - jest to mieszanka trzech najpopularniejszych odpowiedzi:

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;

2

Po prostu inne rozwiązanie wykorzystujące GROUP_CONCAT, więc wykona jedno zapytanie upuszczające, takie jak
DROP TABLE tabela1, tabela2, ..

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;

1

Okazało się, że przygotowane zestawienia były trochę trudne do wykonania dla mnie, ale ustawienie GROUP_CONCAT_MAX_LENbyło niezbędne, gdy masz dużo tabel. Spowodowało to prosty, trzyetapowy proces z wycinaniem i wklejaniem z wiersza poleceń mysql, który działał świetnie:

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_%';

Następnie ostrożnie wytnij i wklej powstałe długie polecenie DROP .


zakończenie zapytania z \Gzamiast ;daje trochę czystszy wynik
Stuart Cardall
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.