Jak usunąć wszystkie tabele MySQL z wiersza polecenia?

29

Zwykle otwieram Terminal.app i łączę się ze zdalną bazą danych MySQL.

Następnie używam tego polecenia, aby upuścić tabelę:

mysql> drop table [table name];

Ale potrzebuję wiersza polecenia, aby usunąć wszystkie tabele z bazy danych.

Jeśli użyję:

mysql> drop database [database name];

Zniszczę bazę danych całkowicie i nie będę mógł ponownie tworzyć tabel. Czy mam rację?

chefnelone
źródło

Odpowiedzi:

27

Możesz usunąć bazę danych, a następnie natychmiast ją ponownie utworzyć:

mysql> drop database [database name];
mysql> create database [database name];

Lub możesz użyć skryptu, aby upuścić każdą tabelę w bazie danych.

William Jackson
źródło
ok, dla pewności: łączę się ze zdalną bazą danych w terminalu za pomocą tego wiersza: / Applications / MAMP / Library / bin / mysql -h 80.54.554.10 -u adm_user -p my_db . Po upuszczeniu i utworzeniu bazy danych, jak powiedziałeś, czy będę musiał zmienić te wartości połączenia, czy pozostaną takie same?
chefnelone
1
@chef - Usunięcie wszystkich tabel i usunięcie całej bazy danych nie ma tego samego efektu. Jeśli upuścisz tylko tabele, pozostaną uprawnienia dla całej bazy danych, a nie jeśli upuścisz / odtworzysz bazę danych.
Nifle
10
@chefnelone: ​​Bądź ostrożny !!! Usunięcie bazy danych powoduje usunięcie procedur przechowywanych i widoków zdefiniowanych przez użytkownika.
RolandoMySQLDBA
Dla mnie całkiem jasne. Pójdę ze skryptem, aby usunąć każdą tabelę.
chefnelone
1
jest to całkowicie niebezpieczne, patrz komentarze http://stackoverflow.com/a/12403742/1713660
vladkras
10

Możesz spróbować wykonać następujące polecenie:

mysqldump --no-data --add-drop-table DB_NAME | grep ^DROP | mysql -v DB_NAME

Lub:

mysql --silent --skip-column-names -e "SHOW TABLES" DB_NAME | xargs -L1 -I% echo 'DROP TABLE `%`;' | mysql -v DB_NAME

Gdzie DB_NAMEjest nazwa twojej bazy danych. Poświadczenia bazy danych można określić w ~/.my.cnflub dodając je do polecenia (np -uroot -proot.).

Ta metoda ma pewne zalety w stosunku do upuszczania i tworzenia bazy danych na wypadek, gdyby użytkownik bazy danych nie miał uprawnień do jej usunięcia.

kenorb
źródło
1
Potwierdzony drugi przykład, super. Dodaj poświadczenia db jako dodatkowe flagi przed --silenti -v/ lub --verboseodpowiednio:--user=username --password=password --host=host.name
tutaj
Dobry pomysł. Ale masz jakiś problem, gdy jest KLUCZ ZAGRANICZNY. Dodam | sort -rdo linii odwrotnej, ale nadal nie jest kompatybilny z niektórymi db.
Fancyoung,
2

mysql -u USERHERE -pPASSWORDHERE --silent --skip-column-names -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%;' | mysql -u USERHERE -pPASSWORDHERE -v DATABASENAMEHERE

sveilleux2
źródło
2
Witamy w Super User! Chociaż może to odpowiedzieć na pytanie, lepszym rozwiązaniem byłoby wyjaśnienie, dlaczego tak się dzieje. Szukamy kompleksowych, wysokiej jakości odpowiedzi, które zawierają wyjaśnienia i kontekst. Nie udzielaj odpowiedzi w jednym wierszu; wyjaśnij, dlaczego Twoja odpowiedź jest poprawna, najlepiej z cytatami. Odpowiedzi, które nie zawierają wyjaśnień, mogą zostać usunięte. Sprawdź także formatowanie.
G-Man mówi „Przywróć Monikę”
Nie zapomnij ustawić Foreign_key_checks = 1 po upuszczeniu tabel: patrz stackoverflow.com/a/2873991/4306855 mysql -u USERHERE -pPASSWORDHERE --silent --skip-nazwa-kolumny--e "POKAŻ TABELE" NAZWA DATABASENU | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%; SET FOREIGN_KEY_CHECKS = 1; ' | mysql -u UŻYTKOWNIK -p HASŁO -v NAZWA BAZY DANYCH
toto21