Miałem dzisiaj potrzebę usunięcia wszystkich tabel w MySQL. Serwer produkcyjny nie posiada phpMyAdmin, który jest moim ulubionym narzędziem w moim środowisku deweloperskim do zarządzania bazami danych MySQL. Więc utknąłem z konsolą MySQL, i potrzebowałem łatwego sposobu na wykonanie tego zadania.
Jak zawsze mówię „Google it”.
Znalazłem elegancki skrypt na SOW. W tym artykule opiszę co on robi linia po linii.
SET FOREIGN_KEY_CHECKS = 0;
Ta linia wyłącza ograniczenia klucza obcego. Jeśli dwie tabele są powiązane ze sobą, to nie możesz usunąć żadnej z nich. Ograniczenie klucza obcego nie pozwala na to.
SET GROUP_CONCAT_MAX_LEN=32768;
Ta linia określa maksymalną długość funkcji CONCAT. W kolejnych liniach skryptu zobaczysz konkatenację. W niektórych konfiguracjach MySQL wartość ta może być zbyt niska. Dlatego aby uniknąć ewentualnych błędów, ustawiamy ją odpowiednio dużą.
SET @tables = NULL;
To jest zmienna, w której przechowujemy nazwy tabel.
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables FROM information_schema.tables WHERE table_schema = (SELECT DATABASE());
Pamiętaj, że wszystkie twoje schematy mysql są przechowywane w bazie information_schema. Funkcja SELECT DATABASE() jest używana do określenia aktualnie używanej bazy danych. Ta linia wybiera listę tabel w aktualnej bazie danych, i dekoruje je znakiem (`), a wynik końcowy będzie przechowywany w zmiennej tables jak poniżej, `table_1`, `table_2`, …, `table_n`.
SELECT IFNULL(@tables,'dummy') INTO @tables;
Ta linia wstawia „dummy” do zmiennej tables jeśli zmienna jest NULL. Ta linia zapewnia, że zmienna tables nigdy nie jest NULL.
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
Ta linia dodaje „DROP TABLE IF EXISTS” przed twoją zmienną tables. Tak więc wynikiem końcowym będzie DROP TABLE IF EXISTS `table_1`, `table_2`, …, `table_n`.
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Nie ma potrzeby oddzielania tych trzech linii. Te linie wykonują zdanie SQL w zmiennej tables.
SET FOREIGN_KEY_CHECKS = 1;
Na koniec ta linia włącza opcję sprawdzania ograniczeń klucza obcego.
Naprawdę spodobał mi się ten mały skrypt. Jest naprawdę poręczny. Mam nadzieję, że pomoże Ci lepiej zrozumieć, jak to działa.