Jak usunąć wszystkie tabele MySQL z wiersza poleceń bez uprawnień DROP database? [duplikat]

To pytanie ma już odpowiedź tutaj:

Jak usunąć wszystkie tabele w Windows MySQL, używając wiersza polecenia? Powodem, dla którego chcę to zrobić, jest to, że nasz użytkownik ma dostęp do dropów bazy danych, ale nie ma dostępu do ponownego tworzenia samej bazy danych, z tego powodu musimy upuścić tabele ręcznie. Czy jest sposób, aby rzucić wszystkie stoły na raz? Należy pamiętać, że większość tabel jest powiązana z kluczami obcymi, więc muszą być upuszczone w określonej kolejności.

Author: Machavity, 2012-09-13

5 answers

Możesz wygenerować instrukcję w następujący sposób: DROP TABLE t1, t2, t3, ... a następnie użyć gotowych instrukcji do jej wykonania:

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; -- specify DB name here.

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 
 289
Author: Devart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-14 08:22:18

Wersja @ Devart jest poprawna, ale oto kilka ulepszeń, aby uniknąć błędów. Edytowałem odpowiedź @ Devart, ale nie została ona przyjęta.

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

Ten skrypt nie spowoduje błędu z wynikiem NULL w przypadku, gdy wszystkie tabele w bazie danych zostały już usunięte przez dodanie przynajmniej jednej nieistniejącej tabeli - "dummy".

I naprawiono w przypadku, gdy masz wiele tabel.

I ta mała zmiana na drop all view istnieje w Bazie Danych

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @views = NULL;
SELECT GROUP_CONCAT('`', TABLE_NAME, '`') INTO @views
  FROM information_schema.views
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@views,'dummy') INTO @views;

SET @views = CONCAT('DROP VIEW IF EXISTS ', @views);
PREPARE stmt FROM @views;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

Zakłada, że uruchamiasz skrypt z bazy danych, którą chcesz usunąć. Lub uruchom to wcześniej:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

Dziękuję Steve ' owi Horvathowi za odkrycie problemu z backticks.

 251
Author: Kostanos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 04:57:43

Spróbuj tego.

To działa nawet dla tabel z ograniczeniami (relacje kluczy obcych). Alternatywnie możesz po prostu upuścić bazę danych i odtworzyć, ale możesz nie mieć niezbędnych uprawnień do tego.

mysqldump -u[USERNAME] -p[PASSWORD] \
  --add-drop-table --no-data [DATABASE] | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

W celu przezwyciężenia efektów sprawdzania kluczy obcych, dodaj show table na końcu wygenerowanego skryptu i uruchom wiele razy, aż polecenie show table spowoduje utworzenie pustego zestawu.

 71
Author: MutantMahesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 11:34:55

Możesz upuścić database, a następnie odtworzyć za pomocą poniższego:-

mysql> drop database [database name];
mysql> create database [database name];
 41
Author: user1086159,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-10 08:21:31

Przyjęta odpowiedź nie działa w przypadku baz danych, które mają dużą liczbę tabel, np. baz danych Drupal. Zamiast tego, Zobacz skrypt tutaj: https://stackoverflow.com/a/12917793/1507877 który działa na MySQL 5.5. Uwaga: wokół linii 11 znajduje się "WHERE table_schema = SCHEMA ();" powinno to być "WHERE table_schema =' Wstaw nazwę DB, do którego nastąpi IMPORT'; "

 6
Author: Giles B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:53