Как удалить все таблицы MySQL из командной строки?

29

Обычно я открываю Terminal.app и подключаюсь к удаленной базе данных MySQL.

Затем я использую эту команду, чтобы удалить таблицу:

mysql> drop table [table name];

Но мне нужна командная строка для удаления всех таблиц в базе данных.

Если я использую:

mysql> drop database [database name];

Я полностью уничтожу базу данных и больше не смогу создавать таблицы. Я прав?

chefnelone
источник

Ответы:

27

Вы можете удалить базу данных и сразу же восстановить ее:

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

Или вы можете использовать скрипт для удаления каждой таблицы в базе данных.

Уильям Джексон
источник
хорошо, просто чтобы быть уверенным: я подключаюсь к удаленной базе данных в терминале с помощью этой строки: / Applications / MAMP / Library / bin / mysql -h 80.54.554.10 -u adm_user -p my_db . После удаления и создания базы данных, как вы сказали, мне нужно будет изменить значения этого соединения или они останутся прежними?
Chefnelone
1
@chef - удаление всех таблиц и всей базы данных не имеет одинакового эффекта. Если вы удаляете только таблицы, все разрешения базы данных останутся, а если вы удалите / пересоздаете базу данных, это не так.
Nifle
10
@chefnelone: ​​будь осторожен !!! Удаление базы данных также удаляет хранимые процедуры и пользовательские представления.
RolandoMySQLDBA
Совершенно ясно для меня. Я пойду со сценарием, чтобы удалить каждую таблицу.
Chefnelone
1
это совершенно небезопасно, см. комментарии http://stackoverflow.com/a/12403742/1713660
vladkras
10

Вы можете попробовать следующую команду:

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

Или:

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

Где DB_NAMEваше имя базы данных. Учетные данные базы данных можно указывать либо в ~/.my.cnfкоманде, либо добавляя их в команду (например -uroot -proot).

Этот метод имеет некоторые преимущества по сравнению с удалением и созданием базы данных в случае, если у пользователя базы данных нет разрешения на ее удаление.

kenorb
источник
1
Подтвердил второй пример, круто. Добавьте учетные данные БД в качестве дополнительных флагов до --silentи -v/ --verboseсоответственно, например:--user=username --password=password --host=host.name
здесь
Отличная идея. Но есть некоторые проблемы, когда есть иностранный ключ. Я добавляю | sort -rк обратной линии, но все еще не совместим некоторые БД.
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
источник
2
Добро пожаловать в Супер пользователя! Хотя это может ответить на вопрос, было бы лучше, если бы вы могли объяснить, почему это так. Мы ищем исчерпывающие, качественные ответы, которые дают некоторое объяснение и контекст. Не просто дать ответ в одну строку; объясните, почему ваш ответ правильный, в идеале с цитатами. Ответы, не содержащие объяснений, могут быть удалены. Также проверьте ваше форматирование.
G-Man говорит: «Восстановите Монику»
Не забудьте набор foreign_key_checks = 1 после таблиц падения: см stackoverflow.com/a/2873991/4306855 MySQL -u USERHERE -pPASSWORDHERE --silent --skip-колонки-имена -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%; SET FOREIGN_KEY_CHECKS = 1; ' | mysql -u ПОЛЬЗОВАТЕЛЬСКИЙ -pPASSWORDHERE -V DATABASENAMEHERE
toto21