Jak usunąć moje tabele, z których wszystkie mają prefiks myprefix_
?
Uwaga: należy go uruchomić w phpMyAdmin
Jak usunąć moje tabele, z których wszystkie mają prefiks myprefix_
?
Uwaga: należy go uruchomić w phpMyAdmin
Odpowiedzi:
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_%';
[...] LIKE 'myprefix\_%';
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.
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 \n
przecinkiem 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;
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.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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.
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;
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;
Okazało się, że przygotowane zestawienia były trochę trudne do wykonania dla mnie, ale ustawienie GROUP_CONCAT_MAX_LEN
był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 .
\G
zamiast ;
daje trochę czystszy wynik