it-swarm.com.de

Wie entferne ich alle MySQL-Tabellen von der Kommandozeile ohne DROP-Datenbankberechtigungen?

Wie lösche ich alle Tabellen in Windows MySQL über die Eingabeaufforderung? Der Grund, warum ich dies tun möchte, ist, dass unser Benutzer Zugriff auf die Datenbank hat, jedoch keinen Zugriff auf die Neuerstellung der Datenbank selbst hat. Aus diesem Grund müssen wir die Tabellen manuell löschen. Gibt es eine Möglichkeit, alle Tische auf einmal zu löschen? Beachten Sie, dass die meisten Tabellen mit Fremdschlüsseln verknüpft sind und daher in einer bestimmten Reihenfolge gelöscht werden müssen.

211
Mantas

Sie können eine Anweisung wie die folgende generieren: DROP TABLE t1, t2, t3, ... und dann mit vorbereiteten Anweisungen ausführen:

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; 
297
Devart

Die @ Devart-Version ist korrekt, aber hier sind einige Verbesserungen, um Fehler zu vermeiden. Ich habe die Antwort von @ Devart bearbeitet, sie wurde jedoch nicht akzeptiert.

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;

Dieses Skript löst keinen Fehler mit dem Ergebnis NULL aus, wenn Sie bereits alle Tabellen in der Datenbank gelöscht haben, indem Sie mindestens eine nicht vorhandene - "Dummy" -Tabelle hinzugefügt haben.

Und es wurde behoben, falls Sie viele Tische haben.

Und diese kleine Änderung zum Löschen aller Ansichten existiert in der Datenbank

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;

Es wird davon ausgegangen, dass Sie das Skript aus der Datenbank ausführen, die Sie löschen möchten. Oder führen Sie dies vor:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

Vielen Dank an Steve Horvath, der das Problem mit Backticks entdeckt hat.

265
Kostanos

Versuche dies.

Dies funktioniert auch für Tabellen mit Einschränkungen (Fremdschlüsselbeziehungen). Alternativ können Sie die Datenbank einfach löschen und neu erstellen, haben jedoch möglicherweise nicht die erforderlichen Berechtigungen, um dies zu tun.

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

Fügen Sie show table am Ende des generierten Skripts hinzu und führen Sie es so oft aus, bis der Befehl show table eine leere Menge ergibt, um die Auswirkungen der Fremdschlüsselprüfung zu überwinden.

73
MutantMahesh

Sie können drop das database und dann recreate es mit den folgenden: -

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

Die akzeptierte Antwort funktioniert nicht für Datenbanken mit einer großen Anzahl von Tabellen, z. Drupal Datenbanken. Lesen Sie stattdessen das Skript hier: https://stackoverflow.com/a/12917793/1507877 welches unter MySQL 5.5 funktioniert. VORSICHT: In Zeile 11 steht "WHERE table_schema = SCHEMA ();" Dies sollte stattdessen "WHERE table_schema = 'NAME DER DB EINFÜGEN, IN DIE DER IMPORT AUFTRETEN WIRD' sein."

6
Giles B