Después de buscar en varios repositorios y sitios webs de internet al final nos encontramos con la solución que te enseñamos aquí.
Solución:
El método más fácil para truncar todas las tablas conservando el esquema.
mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql
mysql -uuser -ppass databasename < databasename.sql
No estoy seguro de si conservará los procedimientos almacenados, ya que no están en uso donde trabajo, pero lo uso regularmente para restablecer las bases de datos.
los -d
activar mysqldump significa "no volcar datos".
los --add-drop-table
antepone una declaración DROP TABLE a cada CREATE TABLE en el volcado.
No lo creo (pero me he equivocado antes). Lo que tiendo a hacer es que esos casos son un proceso de dos pasos.
Si su DBMS tiene una interfaz de línea de comandos, puede usarla para crear un script para hacer la mayor parte del trabajo, algo como:
db2 "select 'db2 delete from ' | tblname from sysibm.systables
where owner = 'pax'" >p2.sh
p2.sh
El primer bit simplemente crea un p2.sh
archivo (o un p2.cmd
bajo Windows) que contiene un delete from
declaración para cada tabla propiedad de pax
. Luego simplemente ejecuta ese archivo de comando para hacer el trabajo sucio. Es posible que desee comprobarlo primero, por supuesto 🙂
No es el proceso de un solo paso que estabas buscando, pero sigue siendo muy simple. Estoy asumiendo aquí que mysql también tiene una interfaz de línea de comandos.
Actualizar:
La versión MySQL de lo anterior parece que debería ser:
echo "select 'mysql truncate table ' | table_name
from information_schema.tables" | mysql >p2.sh
bash p2.sh
Esto usa el truncate
comando que suele ser más eficiente que delete from
para eliminar todas las filas. También utiliza las tablas del sistema MySQL adecuadas para obtener los nombres de las tablas.
Sin embargo, un punto: es posible que desee poner un where
cláusula en esa selección para limitar las tablas a aquellas que desea eliminar. La consulta tal como está intentará eliminar todas las tablas. Una posibilidad es limitarlo con determinadas table_schema
y/o table_type
valores.
La forma más sólida de borrar todas las tablas en una base de datos fue presentada por kostanos en ¿Cómo eliminar todas las tablas MySQL de la línea de comandos sin los permisos de la base de datos DROP?
Dado que el siguiente código borra todas las tablas de la base de datos actual, es posible que desee seleccionar una base de datos diferente antes de continuar.
USE DATABASE_YOU_WANT_TO_CLEAR;
El siguiente fragmento eliminará los datos de las tablas incluso en presencia de datos externos key restricciones También es posible que desee volver a verificar la lista de tablas antes de la limpieza real, en caso de que haya olvidado seleccionar la base de datos adecuada.
-- save current foreign key settings and disable foreign key checks
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET GROUP_CONCAT_MAX_LEN=32768; -- you never know how people name their tables
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE()); -- operates on the current DB
SELECT IFNULL(@tables,'dummy') INTO @tables; -- avoid error if there are no tables
-- At this point you might want to double check the list of tables
-- to be cleared. Run SELECT @tables; to do so.
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET [email protected]_FOREIGN_KEY_CHECKS;