HOWTO · MySQL
Cómo eliminar todas las tablas en MySQL
Elimine de forma segura todas las tablas base de un esquema MySQL, gestione las claves externas y compruebe el resultado.
En esta página
Para eliminar todas las tablas sin borrar la base de datos MySQL, genere una sentencia DROP TABLE revisada para los objetos BASE TABLE del esquema, ejecútela en la misma sesión con FOREIGN_KEY_CHECKS desactivado temporalmente y verifique el resultado. Esto elimina definiciones y datos de forma permanente: haga una copia de seguridad y confirme que el esquema elegido es prescindible.
Use DROP TABLE para esta tarea
DROP TABLE elimina tablas; DELETE elimina filas pero conserva la definición y TRUNCATE vacía una tabla. DROP DATABASE es una operación distinta y más amplia: úsela solo si también desea eliminar el contenedor de la base de datos y los objetos de esquema. Al eliminar una tabla también se eliminan sus triggers y se produce un commit implícito, por lo que una transacción no sirve para deshacer la prueba.
Necesita el privilegio DROP sobre las tablas que elimina. Trabaje con un esquema nombrado, una copia de seguridad o una base de datos desechable conocida, y mantenga la preparación, eliminación y restauración en la misma conexión MySQL.
Genere una lista entrecomillada de tablas base
INFORMATION_SCHEMA.TABLES distingue una BASE TABLE de una vista. Por ello, filtrar con table_type = 'BASE TABLE' evita tratar las vistas conservadas como tablas. La consulta también encierra los identificadores entre acentos graves y duplica un acento grave dentro de un nombre de tabla.
Ajuste group_concat_max_len a la cantidad y longitud de los nombres del esquema. La expresión IF genera un mensaje inocuo si el esquema está vacío en vez de intentar un DROP TABLE sin nombres. Revise el valor generado en @drop_sql antes de ejecutarlo en un entorno parecido a producción.
Elimine tablas base con FK en una sola sesión
El orden de las claves externas puede hacer que fallen eliminaciones individuales. Guarde el valor de sesión actual, desactive las comprobaciones solo en esa sesión controlada, ejecute la sentencia generada y restaure el valor guardado. El siguiente es el fixture exacto de MySQL 8.4.11 utilizado en este artículo: crea dos tablas vinculadas por FK y una vista, elimina solo las tablas e imprime los recuentos antes y después.
#!/bin/sh
# Verify that a generated DROP TABLE statement removes FK-linked base tables.
# A view is retained deliberately so the fixture also proves the table/view boundary.
set -eu
fixture_tmp=$(mktemp -d)
trap 'kill "$server_pid" 2>/dev/null || true; rm -rf "$fixture_tmp"' EXIT INT TERM
mysqld --no-defaults --initialize-insecure --datadir="$fixture_tmp/data" --user=root >/dev/null 2>&1
mysqld --no-defaults --datadir="$fixture_tmp/data" --socket="$fixture_tmp/mysql.sock" \
--pid-file="$fixture_tmp/mysql.pid" --skip-networking --user=root >/dev/null 2>&1 &
server_pid=$!
for _ in $(seq 1 30); do
mysqladmin --no-defaults --socket="$fixture_tmp/mysql.sock" ping >/dev/null 2>&1 && break
sleep 1
done
mysqladmin --no-defaults --socket="$fixture_tmp/mysql.sock" ping >/dev/null 2>&1
mysql --no-defaults --batch --raw --skip-column-names --socket="$fixture_tmp/mysql.sock" <<'SQL'
CREATE DATABASE drop_all_demo;
USE drop_all_demo;
CREATE TABLE parent (id INT PRIMARY KEY);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT child_parent_fk FOREIGN KEY (parent_id) REFERENCES parent(id)
);
CREATE VIEW parent_ids AS SELECT id FROM parent;
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE';
SET SESSION group_concat_max_len = 1048576;
SELECT GROUP_CONCAT(
CONCAT('`', REPLACE(table_name, '`', '``'), '`')
ORDER BY table_name SEPARATOR ', '
)
INTO @table_list
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE';
SET @drop_sql = IF(
@table_list IS NULL,
'SELECT ''No base tables found''',
CONCAT('DROP TABLE IF EXISTS ', @table_list)
);
SET @saved_fk_checks = @@SESSION.foreign_key_checks;
SET SESSION foreign_key_checks = 0;
PREPARE drop_statement FROM @drop_sql;
EXECUTE drop_statement;
DEALLOCATE PREPARE drop_statement;
SET SESSION foreign_key_checks = @saved_fk_checks;
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE';
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_type = 'VIEW';
SELECT @@SESSION.foreign_key_checks;
SQL
2
0
1
1
La salida indica dos tablas base al principio, cero después de la eliminación, una vista conservada y FOREIGN_KEY_CHECKS restaurado a su valor inicial habilitado. Esta estrategia no elimina vistas, procedimientos almacenados, eventos, usuarios ni la propia base de datos.
Verifique el esquema después de eliminar
Ejecute el mismo recuento de INFORMATION_SCHEMA.TABLES del fixture y espere cero filas BASE TABLE. SHOW FULL TABLES FROM your_database también ayuda a comprobar si los objetos restantes son vistas. Si el script cambia FOREIGN_KEY_CHECKS, compruebe su valor de sesión antes de cerrar la conexión; otra sesión no lo hereda.
Entienda el límite de error de las claves externas
Sin desactivar temporalmente las comprobaciones, MySQL rechaza el intento de eliminar una tabla padre referenciada. Este fixture de límite exacto termina con el error 3730 y demuestra por qué puede fallar una lista desordenada de comandos DROP TABLE.
#!/bin/sh
# Demonstrate the foreign-key failure when a referenced table is dropped normally.
set -eu
fixture_tmp=$(mktemp -d)
trap 'kill "$server_pid" 2>/dev/null || true; rm -rf "$fixture_tmp"' EXIT INT TERM
mysqld --no-defaults --initialize-insecure --datadir="$fixture_tmp/data" --user=root >/dev/null 2>&1
mysqld --no-defaults --datadir="$fixture_tmp/data" --socket="$fixture_tmp/mysql.sock" \
--pid-file="$fixture_tmp/mysql.pid" --skip-networking --user=root >/dev/null 2>&1 &
server_pid=$!
for _ in $(seq 1 30); do
mysqladmin --no-defaults --socket="$fixture_tmp/mysql.sock" ping >/dev/null 2>&1 && break
sleep 1
done
mysqladmin --no-defaults --socket="$fixture_tmp/mysql.sock" ping >/dev/null 2>&1
mysql --no-defaults --batch --raw --skip-column-names --socket="$fixture_tmp/mysql.sock" <<'SQL'
CREATE DATABASE fk_boundary_demo;
USE fk_boundary_demo;
CREATE TABLE parent (id INT PRIMARY KEY);
CREATE TABLE child (id INT PRIMARY KEY, parent_id INT, CONSTRAINT child_parent_fk FOREIGN KEY (parent_id) REFERENCES parent(id));
DROP TABLE parent;
SQL
El diagnóstico capturado es ERROR 3730 (HY000): MySQL informa que parent está referenciada por child_parent_fk en child. No use la técnica de comprobaciones desactivadas para eludir una dependencia desconocida; úsela solo después de confirmar que se pretende eliminar todas las tablas base.
Alternativas para bases de datos desechables y automatización de línea de comandos
Para un esquema completamente desechable, eliminar y recrear la base de datos puede ser más simple, pero es más amplio que eliminar tablas. Requiere los privilegios adecuados de base de datos y elimina objetos que el método de tablas base conserva deliberadamente. No lo describa como una forma de conservar vistas, rutinas o eventos.
mysqldump --add-drop-table --no-data puede producir un script de eliminación orientado al shell, útil para automatizar después de revisarlo. No ponga una contraseña directamente en la línea de comandos, inspeccione las sentencias generadas y separe sus problemas de credenciales y portabilidad del método SQL recomendado.
Límites y solución de problemas
Si no se eliminan tablas, compruebe primero el esquema seleccionado y el filtro BASE TABLE. Un esquema muy grande puede superar el límite de GROUP_CONCAT; auméntelo de forma deliberada o genere y revise sentencias por lotes. Un error de privilegios indica que la cuenta no tiene acceso DROP. Las vistas permanecen por diseño; elimínelas aparte solo si forma parte de la limpieza aprobada. Como DROP TABLE confirma implícitamente, restaure desde una copia de seguridad en vez de esperar que un rollback recupere los datos.