Як видалити всі таблиці MySQL з командного рядка?


29

Зазвичай я відкриваю Terminal.app і підключаюся до віддаленої бази даних MySQL.

Потім я використовую цю команду для опускання таблиці:

mysql> drop table [table name];

Але мені потрібно командний рядок, щоб скинути всі таблиці в базу даних.

Якщо я використовую:

mysql> drop database [database name];

Я повністю знищу базу даних і більше не зможу створювати таблиці. Чи правий я?


Відповіді:


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 - Видалення всіх таблиць та видалення всієї бази даних не має однакового ефекту. Якщо ви скидаєте лише таблиці, будь-які дозволи на базу даних залишатимуться не так, якщо ви скидаєте / відтворюєте базу даних.
Ніфле

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).

Цей метод має деякі переваги перед тим, як скидати та створювати базу даних у випадку, якщо користувач бази не має дозволу на її видалення.


1
Підтверджений другий приклад, приголомшливий. Додайте облікові дані db як додаткові прапорці до --silentта -v/ --verboseвідповідно, як:--user=username --password=password --host=host.name
тут

Гарна ідея. Але є певна проблема, коли є ІНОЗЕМНИЙ КЛЮЧ. Я додаю | sort -rдо зворотного рядка, але все ще не сумісний з деякими 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


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 USERHERE -pPASSWORDHERE -v DATABASENAMEHERE
to2121
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.