Existe-t-il une requête (commande) pour tronquer toutes les tables d'une base de données en une seule opération? Je veux savoir si je peux le faire avec une seule requête.
Existe-t-il une requête (commande) pour tronquer toutes les tables d'une base de données en une seule opération? Je veux savoir si je peux le faire avec une seule requête.
Réponses:
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
tronquer plusieurs tables de base de données sur l'instance Mysql
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('db1_name','db2_name');
Utiliser le résultat de la requête pour tronquer les tables
Remarque: vous obtiendrez peut-être cette erreur:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Cela se produit s'il existe des tables avec des références de clés étrangères à la table que vous essayez de supprimer / tronquer.
Avant de tronquer les tableaux Il vous suffit de:
SET FOREIGN_KEY_CHECKS=0;
Tronquez vos tables et modifiez-la
SET FOREIGN_KEY_CHECKS=1;
Utilisez phpMyAdmin de cette manière:
Affichage de la base de données => Tout vérifier (tables) => Vide
Si vous souhaitez ignorer les vérifications de clé étrangère, vous pouvez décocher la case qui dit:
[] Activer les vérifications de clé étrangère
Vous devrez exécuter au moins la version 4.5.0 ou supérieure pour obtenir cette case à cocher.
Ce n'est pas MySQL CLI-fu, mais bon, ça marche!
MS SQL Server 2005+ (Supprimer PRINT pour une exécution réelle ...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
Si votre plateforme de base de données prend en charge les vues INFORMATION_SCHEMA, prenez les résultats de la requête suivante et exécutez-les.
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Essayez ceci pour MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
L'ajout d'un point-virgule au Concat le rend plus facile à utiliser, par exemple à partir de MySQL Workbench.
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
J'ai trouvé cela pour supprimer toutes les tables d'une base de données:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
Utile si vous êtes limité par la solution d'hébergement (impossible de supprimer une base de données entière).
Je l'ai modifié pour tronquer les tables. Il n'y a pas de "--add-truncate-table" pour mysqldump, donc j'ai fait:
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
fonctionne pour moi --modifier, corriger une faute de frappe dans la dernière commande
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
ceci:AND table_schema = DATABASE();
J'ai trouvé le plus simple de faire quelque chose comme le code ci-dessous, il suffit de remplacer les noms de table par les vôtres. important de vous assurer que la dernière ligne est toujours 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;
Cela affichera la commande pour tronquer toutes les tables:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
Une fois la troncature des données effectuée, créez à nouveau les mêmes contraintes de clé étrangère sur la même table. Voir ci-dessous un script qui générerait le script pour effectuer les opérations ci-dessus.
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';
Maintenant, exécutez le script Db Truncate.sql généré
Avantages. 1) Récupérer de l'espace disque 2) Pas nécessaire pour supprimer et recréer le DB / Schema avec la même structure
Désavantages. 1) Les contraintes FK doivent être des noms dans la table avec le nom contenant «FK» dans le nom de la contrainte.
si vous utilisez SQL Server 2005, il existe une procédure stockée masquée qui vous permet d'exécuter une commande ou un ensemble de commandes sur toutes les tables d'une base de données. Voici comment vous appelleriez TRUNCATE TABLE
avec cette procédure stockée:
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
Ici un bon article qui approfondit.
Pour MySql, cependant, vous pouvez utiliser mysqldump et spécifier les options --add-drop-tables
et --no-data
pour supprimer et créer toutes les tables en ignorant les données. comme ça:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
Utilisez-le et formez la requête
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';
Maintenant, utilisez ceci pour utiliser cette requête
mysql -u username -p </path/to/file.sql
si vous obtenez une erreur comme celle-ci
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
la façon la plus simple de passer est en haut de votre fichier ajoutez cette ligne
SET FOREIGN_KEY_CHECKS=0;
ce qui signifie que nous ne voulons pas vérifier les contraintes de clé étrangère en parcourant ce fichier.
Il tronquera toutes les tables des bases de données db1 et bd2.
Non. Il n'y a pas de commande unique pour tronquer toutes les tables mysql à la fois. Vous devrez créer un petit script pour tronquer les tableaux un par un.
réf: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
Voici ma variante pour avoir «une instruction pour les tronquer tous».
Tout d'abord, j'utilise une base de données distincte nommée «util» pour mes procédures stockées d'assistance. Le code de ma procédure stockée pour tronquer toutes les tables est:
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 ;
Une fois que vous avez cette procédure stockée dans votre base de données util, vous pouvez l'appeler comme
call util.trunctables('nameofdatabase');
qui est maintenant exactement une déclaration :-)
ici car je sais ici
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename1','databasename2');
Si ne peut pas supprimer ou mettre à jour une ligne parent: une contrainte de clé étrangère échoue
Cela se produit s'il existe des tables avec des références de clés étrangères à la table que vous essayez de supprimer / tronquer.
Avant de tronquer les tableaux Il vous suffit de:
SET FOREIGN_KEY_CHECKS=0;
Tronquez vos tables et modifiez-la
SET FOREIGN_KEY_CHECKS=1;
utiliser ce code 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']);
}
?>
vérifier les détails ici lien
Voici une procédure qui devrait tronquer toutes les tables de la base de données locale.
Faites-moi savoir si cela ne fonctionne pas et je supprimerai cette réponse.
Non testé
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;
Je trouve que TRUNCATE TABLE .. a des problèmes avec les contraintes de clé étrangère, même après une NOCHECK CONSTRAINT ALL, donc j'utilise à la place une instruction DELETE FROM. Cela signifie que les graines d'identité ne sont pas réinitialisées, vous pouvez toujours ajouter un CHECKIDENT DBCC pour y parvenir.
I Utilisez le code ci-dessous pour imprimer dans la fenêtre de message le sql pour tronquer toutes les tables de la base de données, avant de l'exécuter. Cela rend juste un peu plus difficile de faire une erreur.
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'''
Je ne suis pas sûr mais je pense qu'il existe une commande à l'aide de laquelle vous pouvez copier le schéma de la base de données dans une nouvelle base de données, une fois que vous avez fait cela, vous pouvez supprimer l'ancienne base de données et après cela, vous pouvez à nouveau copier le schéma de la base de données sous l'ancien nom.
Je sais que ce n'est pas exactement une commande, mais le résultat souhaité peut être obtenu à partir de phpMyAdmin en suivant ces étapes:
L'idée est d'obtenir rapidement toutes les tables de la base de données (ce que vous faites en 5 secondes et 2 clics) mais désactivez d'abord les vérifications de clés étrangères. Aucune CLI et aucune suppression de la base de données et ajout à nouveau.
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,
Merci d'avoir pris le temps de formater le code, mais c'est ainsi qu'il est censé être appliqué.
-Kurt
Sur un boîtier UNIX ou Linux:
Assurez-vous que vous êtes dans un shell bash. Ces commandes doivent être exécutées à partir de la ligne de commande comme suit.
Remarque:
Je stocke mes informations d'identification dans mon fichier ~ / .my.cnf, donc je n'ai pas besoin de les fournir sur la ligne de commande.
Remarque:
cpm est le nom de la base de données
Je ne montre qu'un petit échantillon des résultats de chaque commande.
Trouvez vos contraintes de clé étrangère:
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"
Énumérez les tables et le nombre de lignes:
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
Tronquez vos tableaux:
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
Vérifiez que cela a fonctionné:
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
Sur une boîte Windows:
REMARQUE:
cpm est le nom de la base de données
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 requête MySQL suivante produira elle-même une seule requête qui tronquera toutes les tables d'une base de données donnée. Il contourne les clés étrangères:
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
-- Éditer ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
Cela a fonctionné pour moi. Modifiez la base de données, le nom d'utilisateur et le mot de passe en conséquence.
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
Une idée pourrait être de simplement supprimer et recréer les tableaux?
ÉDITER:
@Jonathan Leffler: Vrai
Autre suggestion (ou cas où vous n'avez pas besoin de tronquer TOUTES les tables):
Pourquoi ne pas simplement créer une procédure stockée de base pour tronquer des tables spécifiques
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();
?>
Voici un extrait de code que j'utilise pour effacer une table. Modifiez simplement $ conn info et TABLE_NAME.