¿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.
¿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.
Respuestas:
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
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
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 delete or update a parent row: a foreign key constraint 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:
SET FOREIGN_KEY_CHECKS=0;
Trunca tus tablas y vuelve a cambiarlas a
SET FOREIGN_KEY_CHECKS=1;
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.
No es MySQL CLI-fu, pero bueno, ¡funciona!
MS SQL Server 2005+ (Eliminar PRINT para la ejecución real ...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
Si su plataforma de base de datos admite vistas de INFORMATION_SCHEMA, tome los resultados de la siguiente consulta y ejecútelos.
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Prueba esto para MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
Agregar un punto y coma al Concat hace que sea más fácil de usar, por ejemplo, desde mysql workbench.
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
Encontré esto para descartar todas las tablas en una base de datos:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
Ú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:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME
funciona para mí: editar, corregir un error tipográfico en el último comando
SET FOREIGN_KEY_CHECKS = 0;
SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema IN ('db1_name','db2_name');
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
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;
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
Esto imprimirá el comando para truncar todas las tablas:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
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.
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
UNION
SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
UNION
SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
UNION
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';
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.
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:
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
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:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
Usa esto y forma la consulta
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';
Ahora use esto para usar esta consulta
mysql -u username -p </path/to/file.sql
si recibes un error como este
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
la forma más fácil de hacerlo es en la parte superior de su archivo, agregue esta línea
SET FOREIGN_KEY_CHECKS=0;
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.
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
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:
DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE PROCEDURE trunctables(theDb varchar(64))
BEGIN
declare tname varchar(64);
declare tcursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
SET FOREIGN_KEY_CHECKS = 0;
OPEN tcursor;
l1: LOOP
FETCH tcursor INTO tname;
if tname = NULL then leave l1; end if;
set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
PREPARE stmt from @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP l1;
CLOSE tcursor;
SET FOREIGN_KEY_CHECKS = 1;
END ;;
DELIMITER ;
Una vez que tenga este procedimiento almacenado en su base de datos de utilidades, puede llamarlo como
call util.trunctables('nameofdatabase');
que ahora es exactamente una declaración :-)
aquí porque lo sé aquí
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']);
}
?>
ver detalle aquí enlace
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
CREATE PROCEDURE truncate_all_tables()
BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE cmd VARCHAR(2000);
-- Declare the cursor
DECLARE cmds CURSOR
FOR
SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;
-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- Open the cursor
OPEN cmds;
-- Loop through all rows
REPEAT
-- Get order number
FETCH cmds INTO cmd;
-- Execute the command
PREPARE stmt FROM cmd;
EXECUTE stmt;
DROP PREPARE stmt;
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE cmds;
END;
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.
EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''
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.
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.
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"
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 297
2 approval_external_system 0
3 approval_request 0
4 country 189
5 credential 468
6 customer 6776
7 customer_identification 5631
8 customer_image 2
9 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
Verifique que funcionó:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 0
2 approval_external_system 0
3 approval_request 0
4 country 0
5 credential 0
6 customer 0
7 customer_identification 0
8 customer_image 0
9 customer_status 0
10 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
La siguiente consulta MySQL producirá una consulta única que truncará todas las tablas en una base de datos dada. Omite las teclas EXTRANJERAS:
SELECT CONCAT(
'SET FOREIGN_KEY_CHECKS=0; ',
GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
'SET FOREIGN_KEY_CHECKS=1;'
) as dropAllTablesSql
FROM ( SELECT Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'DATABASE_NAME' ) as queries
Soln 1)
mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;
Soln 2)
- Export only structure of a db
- drop the database
- import the .sql of structure
- editar ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
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
¿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?
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");
// check connection
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);
// Print message
if ($sql === TRUE) {
echo 'data delete successfully';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
Aquí hay un fragmento de código que utilizo para borrar una tabla. Simplemente cambie $ conn info y TABLE_NAME.