¿Truncar todas las tablas en una base de datos MySQL en un comando?
346
¿Hay una consulta (comando) para truncar todas las tablas en una base de datos en una sola operación? Quiero saber si puedo hacer esto con una sola consulta.
Truncar todas las tablas? ¿quiso decir truncar todas las columnas de todas las tablas en una base de datos? ¿En qué idioma de consulta está esto? (por ejemplo, SQL, MySQL, Oracle, Postgres, etc.)
Jay
No estoy seguro de que recomendaría hacer esto, ya que fácilmente podría meterse en problemas. ¿Hay alguna razón por la que no puede simplemente ejecutar el script truncado y ejecutar el script?
GrayWizardx
gracias 4 la respuesta, pero no única razón de scripting que se está ejecutando corto de tiempo por lo pensado runnind una consulta en MySQL
Devang
Ya su consulta en medios mysql..and algo similar a la tabla truncada table_name..here quiero truncar todas las filas de todas las tablas en mi db en una consulta
Devang
Puede usar Information_Schema con un cursor. No estoy seguro acerca de MySql, pero debería admitir Information_Schema.Tables
GrayWizardx
Respuestas:
340
Drop (es decir, eliminar tablas)
mysql -Nse 'show tables' DATABASE_NAME |whilereadtable; do mysql -e "drop table $table" DATABASE_NAME; done
Truncar (es decir, tablas vacías)
mysql -Nse 'show tables' DATABASE_NAME |whilereadtable; do mysql -e "truncate table $table" DATABASE_NAME; done
Sí, limpio, ty. Pero es posible que deba ejecutar esto con -uUSER -pPASSWORD. También es posible que deba ejecutarlo varias veces si tiene FK sin borrar en cascada.
mihaicc
47
Si se encuentra con problemas de FK como " No se puede eliminar o actualizar una fila principal: falla una restricción de clave externa ", asegúrese de desactivar las comprobaciones de clave externa modificando el comando de la siguiente manera:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.
24
Sin embargo, no es necesario hacer un bucle en el cliente mysql. mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Con base en la respuesta y los comentarios anteriores, y debido a que no funcionaron como se esperaba para mí, hice un script bash simple que puedes usar para esto. Puede encontrarlo en: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga
145
truncar varias tablas de base de datos en la instancia de Mysql
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME,';')FROM INFORMATION_SCHEMA.TABLES where table_schema in('db1_name','db2_name');
Usar resultado de consulta para truncar tablas
Nota: es posible que obtenga este error:
ERROR 1217(23000): Cannot deleteorupdate a parent row: a foreignkeyconstraint fails
Eso sucede si hay tablas con referencias de claves foráneas a la tabla que está tratando de soltar / truncar.
Antes de truncar las tablas Todo lo que necesita hacer es:
Esta es probablemente la mejor solución si tiene un usuario y una contraseña para su base de datos, y no desea escribirlos visiblemente en su shell.
Bach
55
Upvoted porque esta solución requiere solo acceso a base de datos y no acceso SSH. Además, es independiente del sistema operativo.
mastazi
@mastazi tengo algunas preguntas: 1. ¿Qué significa "table_schema"? ¿está parado desde el nombre del esquema? 2.¿Qué significa TABLE_NAME? ¿está parado para las tablas que se deben eliminar? 3. ¿Debo escribir alto las tablas que se deben eliminar en el comando como "('db1_name', 'db2_name')"?
AAEM
@Ahmed, las únicas sustituciones requeridas es que debe reemplazar db1_name y db2_name con los nombres de sus bases de datos. Luego debe copiar los resultados de esta consulta, pegarlos como una nueva consulta mysql y ejecutarlos. INFORMATION_SCHEMA es un esquema incorporado que viene preinstalado en cada instalación de MySQL y contiene información sobre sus bases de datos, no lo toque o su MySQL comenzará a comportarse mal :-) table_schema y table_name son columnas de la tabla llamada "TABLES" dentro de information_schema
mastazi
por "db_name", ¿te refieres al nombre del esquema? solo tengo 1 esquema en el que quiero eliminar sus datos de tablas
AAEM
67
Use phpMyAdmin de esta manera:
Vista de base de datos => Verificar todo (tablas) => Vacío
Si desea ignorar las comprobaciones de claves externas, puede desmarcar la casilla que dice:
[] Habilitar comprobaciones de clave externa
Deberá ejecutar al menos la versión 4.5.0 o superior para obtener esta casilla de verificación.
hi..thanks para D Responder he intentado esta consulta, pero tampoco parece work..is der algo así como truncate table nombre_tabla el que puedo utilizar para todas las tablas en mi db ..
Devang
Olvidé que MySQL no es compatible con el operador "+" directamente. Suponiendo que ese sea el error, agregué el ejemplo CONCAT () anterior. Si aún recibe un mensaje de error, comparta el mensaje de error real.
playa
esta consulta funciona, pero ¿qué pasa si tengo un nombre de base de datos diferente, por ejemplo, devang ... es mi nombre de base de datos, así que si lo uso de acuerdo con su consulta anterior arroja el siguiente error ... La tabla 'devang.TABLES' no existe
devang
3
Ahh INFORMATION_SCHEMA es una vista que existe en la base de datos activa. Si cambia su base de datos, la vista se ejecutará en esa base de datos. No es necesario modificar la consulta al cambiar las bases de datos. Simplemente siga estos pasos: 1) cambie la base de datos activa. 2) ejecuta el script. 3) copie los resultados 4) pegue los resultados nuevamente en el editor 5) ejecute los resultados. Todas las tablas en la base de datos activa ahora están truncadas.
playa
1
¡TENER CUIDADO! Esto selecciona todas las tablas en todas las bases de datos (incluso las que NO están en la base de datos actual. El ejemplo de MySQL no funciona, pero en mi caso devolvió 293 filas (tablas) en lugar de 66. Imagine la pérdida de datos ...
f4der
19
Encontré esto para descartar todas las tablas en una base de datos:
Si desea trabajar con la base de datos actual (y, por lo tanto, hacer que este código sea portátil), cambie la última condición SELECTa esta:AND table_schema = DATABASE();
alx
No se trunca para mí. MySQL 5.7.25
Lucas Bustamante
14
Me pareció más simple hacer algo como el código a continuación, simplemente reemplazar los nombres de las tablas con los suyos. importante, asegúrese de que la última línea siempre sea SET FOREIGN_KEY_CHECKS = 1;
SET FOREIGN_KEY_CHECKS=0;TRUNCATE`table1`;TRUNCATE`table2`;TRUNCATE`table3`;TRUNCATE`table4`;TRUNCATE`table5`;TRUNCATE`table6`;TRUNCATE`table7`;SET FOREIGN_KEY_CHECKS=1;
Para truncar una tabla, se deben eliminar las restricciones de clave externa asignadas a las columnas de esta tabla desde otras tablas (de hecho, en todas las tablas del DB / esquema específico).
Por lo tanto, todas las restricciones de clave externa deben eliminarse inicialmente, seguidas del truncamiento de la tabla.
Opcionalmente, use la tabla de optimización (en mysql, innodb engine esp) para reclamar el espacio / tamaño de datos utilizados al sistema operativo después del truncamiento de datos.
Una vez que se realiza el truncamiento de datos, vuelva a crear las mismas restricciones de clave externa en la misma tabla. Vea a continuación un script que generaría el script para llevar a cabo las operaciones anteriores.
si usa sql server 2005, hay un procedimiento almacenado oculto que le permite ejecutar un comando o un conjunto de comandos en todas las tablas dentro de una base de datos. Así es como llamaría TRUNCATE TABLEcon este procedimiento almacenado:
Sin embargo, para MySql, podría usar mysqldump y especificar las opciones --add-drop-tablesy --no-datapara descartar y crear todas las tablas ignorando los datos. Me gusta esto:
Aquí está mi variante para tener 'una declaración para truncarlos a todos'.
Primero, estoy usando una base de datos separada llamada 'util' para mis procedimientos almacenados auxiliares. El código de mi procedimiento almacenado para truncar todas las tablas es:
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME,';')FROM INFORMATION_SCHEMA.TABLES where table_schema in('databasename1','databasename2');
Si no puede eliminar o actualizar una fila principal: falla una restricción de clave externa
Eso sucede si hay tablas con referencias de claves foráneas a la tabla que está tratando de soltar / truncar.
Antes de truncar las tablas Todo lo que necesita hacer es:
SET FOREIGN_KEY_CHECKS=0;
Trunca tus tablas y vuelve a cambiarlas a
SET FOREIGN_KEY_CHECKS=1;
usa este código php
$truncate= mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");while($truncateRow=mysql_fetch_assoc($truncate)){
mysql_query($truncateRow['tables_query']);}?>
Aquí hay un procedimiento que debería truncar todas las tablas en la base de datos local.
Avíseme si no funciona y eliminaré esta respuesta.
No probado
CREATEPROCEDURE truncate_all_tables()BEGIN-- Declare local variablesDECLARE done BOOLEAN DEFAULT0;DECLARE cmd VARCHAR(2000);-- Declare the cursorDECLARE cmds CURSORFORSELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME)FROM INFORMATION_SCHEMA.TABLES;-- Declare continue handlerDECLARECONTINUE HANDLER FOR SQLSTATE '02000'SET done=1;-- Open the cursorOPEN cmds;-- Loop through all rows
REPEAT
-- Get order numberFETCH cmds INTO cmd;-- Execute the command
PREPARE stmt FROM cmd;EXECUTE stmt;DROP PREPARE stmt;-- End of loop
UNTIL done END REPEAT;-- Close the cursorCLOSE cmds;END;
Me tomó mucho tiempo descubrir por qué esto no funcionaba. Luego, un comentario sobre este hilo de correo electrónico ayudó: foros.mysql.com/read.php?61,116597,219343#msg-219343 - Para referencia : "Desafortunadamente, parece que las declaraciones de preparación no se pueden usar en cursores. Del manual: dev.mysql.com/doc/refman/6.0/en/… "
Tominator
1
Encuentro que TRUNCATE TABLE ... tiene problemas con las restricciones de clave externa, incluso después de NOCHECK CONSTRAINT ALL, por lo que en su lugar uso una instrucción DELETE FROM. Esto significa que las semillas de identidad no se restablecen, siempre puede agregar un DBCC CHECKIDENT para lograr esto.
Uso el siguiente código para imprimir en la ventana de mensajes el sql para truncar todas las tablas de la base de datos, antes de ejecutarlo. Simplemente hace que sea un poco más difícil cometer un error.
No estoy seguro, pero creo que hay un comando con el que puede copiar el esquema de la base de datos en una nueva base de datos, una vez que haya hecho esto, puede eliminar la base de datos anterior y después de esto puede copiar nuevamente el esquema de la base de datos al nombre anterior.
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Esto creará un archivo sql con el esquema solamente (sin datos). Puede eliminar la base de datos después de este comando y puede volver a crear la base de datos importando el esquema.
GJ.
0
Sé que este no es exactamente un comando, pero el resultado deseado se puede lograr desde phpMyAdmin siguiendo estos pasos:
Seleccione (todas) las tablas que se eliminarán (Marcar todo)
Seleccione "Soltar" / "Truncar" de la lista "Con seleccionado:"
En la página de confirmación ("¿Realmente quieres:") copiar la consulta (todo con el fondo rojo)
Ve a la parte superior y haz clic en SQL y escribe: "SET FOREIGN_KEY_CHECKS = 0;" luego pegue la consulta copiada previamente
Haga clic en "Ir"
La idea es obtener rápidamente todas las tablas de la base de datos (lo que hace en 5 segundos y 2 clics) pero deshabilitar primero las comprobaciones de clave externa. Sin CLI y sin descartar la base de datos y agregarla nuevamente.
TB=$( mysql -Bse "show tables from DATABASE");for i in${TB};
do echo "Truncating table ${i}";
mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
sleep 1;
done
-
David
Gracias por tomarse el tiempo para formatear el código, pero así es como se supone que debe aplicarse.
-Kurt
En una caja UNIX o Linux:
Asegúrate de estar en un bash shell. Estos comandos deben ejecutarse desde la línea de comandos de la siguiente manera.
Nota:
Guardo mis credenciales en mi archivo ~ / .my.cnf, por lo que no necesito proporcionarlas en la línea de comandos.
Nota:
cpm es el nombre de la base de datos
Solo estoy mostrando una pequeña muestra de los resultados, de cada comando.
Encuentre sus restricciones de clave externa:
klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
from information_schema.referential_constraints
where constraint_schema = 'cpm'
order by referenced_table_name"
el sistema de aprobación_externa depende de la solicitud de aprobación
dirección depende del cliente
identificación_cliente depende del cliente
external_id depende del cliente
credencial depende del cliente
email_address depende del cliente
request_request depende del cliente
customer_status depende del cliente
customer_image depende del cliente
Enumere las tablas y los recuentos de filas:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'"| cat -n
1 address 2972 approval_external_system 03 approval_request 04 country 1895 credential 4686 customer 67767 customer_identification 56318 customer_image 29 customer_status 13639
Truncar tus tablas:
klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm");for i in${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
Truncar la dirección de la tabla
Truncando tabla sistema_externo_aprobación
Truncar la tabla de aprobación
Truncar tabla país
Truncar la credencial de la tabla
Truncar cliente de mesa
Truncando tabla customer_identification
Truncando la tabla customer_image
Truncando tabla customer_status
Verifique que funcionó:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'"| cat -n
1 address 02 approval_external_system 03 approval_request 04 country 05 credential 06 customer 07 customer_identification 08 customer_image 09 customer_status 010 email_address 0
En una caja de Windows:
NOTA:
cpm es el nombre de la base de datos
C:\>for/F "tokens=*"%a IN('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm
Eso pierde todas las restricciones, permisos, vistas, etc. en las tablas, lo cual es una molestia considerable.
Jonathan Leffler
Puede hacer una eliminación, luego reiniciar todas las tablas en lugar de truncar. Supongo que la reducción es por frustración. Simplemente restaure su copia de seguridad.
Hola James, creo que el OP está buscando en primer lugar un trazador de líneas ... y en segundo lugar un comando para quitar todas las tablas y eliminarlas. Esto requiere algún tipo de intervención del usuario. gracias por el post sin embargo
Respuestas:
Drop (es decir, eliminar tablas)
Truncar (es decir, tablas vacías)
fuente
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
truncar varias tablas de base de datos en la instancia de Mysql
Usar resultado de consulta para truncar tablas
Nota: es posible que obtenga este error:
Eso sucede si hay tablas con referencias de claves foráneas a la tabla que está tratando de soltar / truncar.
Antes de truncar las tablas Todo lo que necesita hacer es:
Trunca tus tablas y vuelve a cambiarlas a
fuente
Use phpMyAdmin de esta manera:
Si desea ignorar las comprobaciones de claves externas, puede desmarcar la casilla que dice:
Deberá ejecutar al menos la versión 4.5.0 o superior para obtener esta casilla de verificación.
No es MySQL CLI-fu, pero bueno, ¡funciona!
fuente
MS SQL Server 2005+ (Eliminar PRINT para la ejecución real ...)
Si su plataforma de base de datos admite vistas de INFORMATION_SCHEMA, tome los resultados de la siguiente consulta y ejecútelos.
Prueba esto para MySQL:
Agregar un punto y coma al Concat hace que sea más fácil de usar, por ejemplo, desde mysql workbench.
fuente
Encontré esto para descartar todas las tablas en una base de datos:
Útil si está limitado por la solución de alojamiento (no puede soltar una base de datos completa).
Lo modifiqué para truncar las tablas. No hay "--add-truncate-table" para mysqldump, así que lo hice:
funciona para mí: editar, corregir un error tipográfico en el último comando
fuente
fuente
SELECT
a esta:AND table_schema = DATABASE();
Me pareció más simple hacer algo como el código a continuación, simplemente reemplazar los nombres de las tablas con los suyos. importante, asegúrese de que la última línea siempre sea SET FOREIGN_KEY_CHECKS = 1;
fuente
Esto imprimirá el comando para truncar todas las tablas:
fuente
Una vez que se realiza el truncamiento de datos, vuelva a crear las mismas restricciones de clave externa en la misma tabla. Vea a continuación un script que generaría el script para llevar a cabo las operaciones anteriores.
Ahora, ejecute el script Db Truncate.sql generado
Beneficios 1) Recuperar espacio en disco 2) No es necesario soltar y volver a crear el DB / Esquema con la misma estructura
Inconvenientes. 1) Las restricciones FK deben ser nombres en la tabla con el nombre que contenga 'FK' en el nombre de la restricción.
fuente
si usa sql server 2005, hay un procedimiento almacenado oculto que le permite ejecutar un comando o un conjunto de comandos en todas las tablas dentro de una base de datos. Así es como llamaría
TRUNCATE TABLE
con este procedimiento almacenado:Aquí hay un buen artículo que elabora más.
Sin embargo, para MySql, podría usar mysqldump y especificar las opciones
--add-drop-tables
y--no-data
para descartar y crear todas las tablas ignorando los datos. Me gusta esto:guía de uso de mysqldump de dev.mysql
fuente
Usa esto y forma la consulta
Ahora use esto para usar esta consulta
si recibes un error como este
la forma más fácil de hacerlo es en la parte superior de su archivo, agregue esta línea
que dice que no queremos verificar las restricciones de clave externa mientras revisamos este archivo.
Truncará todas las tablas en las bases de datos db1 y bd2.
fuente
No. No hay un solo comando para truncar todas las tablas mysql a la vez. Tendrá que crear un pequeño script para truncar las tablas una por una.
ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
fuente
Aquí está mi variante para tener 'una declaración para truncarlos a todos'.
Primero, estoy usando una base de datos separada llamada 'util' para mis procedimientos almacenados auxiliares. El código de mi procedimiento almacenado para truncar todas las tablas es:
Una vez que tenga este procedimiento almacenado en su base de datos de utilidades, puede llamarlo como
que ahora es exactamente una declaración :-)
fuente
aquí porque lo sé aquí
Si no puede eliminar o actualizar una fila principal: falla una restricción de clave externa
Eso sucede si hay tablas con referencias de claves foráneas a la tabla que está tratando de soltar / truncar.
Antes de truncar las tablas Todo lo que necesita hacer es:
Trunca tus tablas y vuelve a cambiarlas a
usa este código php
ver detalle aquí enlace
fuente
Aquí hay un procedimiento que debería truncar todas las tablas en la base de datos local.
Avíseme si no funciona y eliminaré esta respuesta.
No probado
fuente
Encuentro que TRUNCATE TABLE ... tiene problemas con las restricciones de clave externa, incluso después de NOCHECK CONSTRAINT ALL, por lo que en su lugar uso una instrucción DELETE FROM. Esto significa que las semillas de identidad no se restablecen, siempre puede agregar un DBCC CHECKIDENT para lograr esto.
Uso el siguiente código para imprimir en la ventana de mensajes el sql para truncar todas las tablas de la base de datos, antes de ejecutarlo. Simplemente hace que sea un poco más difícil cometer un error.
fuente
No estoy seguro, pero creo que hay un comando con el que puede copiar el esquema de la base de datos en una nueva base de datos, una vez que haya hecho esto, puede eliminar la base de datos anterior y después de esto puede copiar nuevamente el esquema de la base de datos al nombre anterior.
fuente
Sé que este no es exactamente un comando, pero el resultado deseado se puede lograr desde phpMyAdmin siguiendo estos pasos:
La idea es obtener rápidamente todas las tablas de la base de datos (lo que hace en 5 segundos y 2 clics) pero deshabilitar primero las comprobaciones de clave externa. Sin CLI y sin descartar la base de datos y agregarla nuevamente.
fuente
-
David
Gracias por tomarse el tiempo para formatear el código, pero así es como se supone que debe aplicarse.
-Kurt
En una caja UNIX o Linux:
Asegúrate de estar en un bash shell. Estos comandos deben ejecutarse desde la línea de comandos de la siguiente manera.
Nota:
Guardo mis credenciales en mi archivo ~ / .my.cnf, por lo que no necesito proporcionarlas en la línea de comandos.
Nota:
cpm es el nombre de la base de datos
Solo estoy mostrando una pequeña muestra de los resultados, de cada comando.
Encuentre sus restricciones de clave externa:
Enumere las tablas y los recuentos de filas:
Truncar tus tablas:
Verifique que funcionó:
En una caja de Windows:
NOTA:
cpm es el nombre de la base de datos
fuente
La siguiente consulta MySQL producirá una consulta única que truncará todas las tablas en una base de datos dada. Omite las teclas EXTRANJERAS:
fuente
fuente
Soln 1)
Soln 2)
- editar ----
fuente
Esto funcionó para mí. Cambie la base de datos, el nombre de usuario y la contraseña en consecuencia.
mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD
fuente
¿Una idea podría ser simplemente dejar caer y recrear las tablas?
EDITAR:
@ Jonathan Leffler: Verdadero
Otra sugerencia (o caso de que no necesite truncar TODAS las tablas):
¿Por qué no crear un procedimiento almacenado básico para truncar tablas específicas?
fuente
Aquí hay un fragmento de código que utilizo para borrar una tabla. Simplemente cambie $ conn info y TABLE_NAME.
fuente