¿Cómo eliminar todas las tablas MySQL de la línea de comandos sin SOLTAR permisos de base de datos? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

¿Cómo puedo soltar todas las tablas en MySQL de Windows, utilizando el símbolo del sistema? La razón por la que quiero hacer esto es que nuestro usuario tiene acceso a la base de datos drops, pero no tiene acceso para volver a crear la base de datos en sí, por esta razón debemos soltar las tablas manualmente. ¿Hay alguna manera de dejar caer todas las mesas a la vez? Tenga en cuenta que la mayoría de las tablas están vinculadas con claves foráneas por lo que tendrían que ser eliminadas en un orden específico.

Author: Machavity, 2012-09-13

5 answers

Puede generar una instrucción como esta: DROP TABLE t1, t2, t3, ... y luego usar instrucciones preparadas para ejecutarla:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-14 08:22:18

La versión de @Devart es correcta, pero aquí hay algunas mejoras para evitar errores. He editado la respuesta de @Devart, pero no fue aceptada.

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;

Este script no generará error con resultado NULO en caso de que ya haya eliminado todas las tablas de la base de datos agregando al menos una tabla inexistente - "dummy".

Y se arregló en caso de que tenga muchas tablas.

Y este pequeño cambio para soltar toda la vista existe en la Base de datos

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;

Se supone que ejecute el script desde la base de datos que desea eliminar. O ejecute esto antes:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

Gracias a Steve Horvath por descubrir el problema con backsticks.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-13 04:57:43

Prueba esto.

Esto funciona incluso para tablas con restricciones (relaciones de clave foránea). Alternativamente, puede simplemente soltar la base de datos y volver a crear, pero es posible que no tenga los permisos necesarios para hacerlo.

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

Para superar los efectos de comprobación de claves foráneas, agregue show table al final del script generado y ejecute muchas veces hasta que el comando show table resulte en un conjunto vacío.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-01 11:34:55

Puede drop el database y luego recrear con el siguiente:-

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-10 08:21:31

La respuesta aceptada no funciona para bases de datos que tienen un gran número de tablas, por ejemplo, bases de datos Drupal. En su lugar, vea el script aquí: https://stackoverflow.com/a/12917793/1507877 que funciona en MySQL 5.5. PRECAUCIÓN: Alrededor de la línea 11, hay un " WHERE table_schema = SCHEMA();" Esto debería ser "WHERE table_schema = 'INSERTE EL NOMBRE DE LA BASE DE DATOS EN LA QUE SE PRODUCIRÁ LA IMPORTACIÓN';"

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:53