web-dev-qa-db-fra.com

Tronquer toutes les tables d'une base de données MySQL en une seule commande?

Existe-t-il une requête (commande) permettant de 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.

319
devang

Drop (c'est-à-dire supprimer des tables)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

Troncature (c'est-à-dire tables vides)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
323
battousaix

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 y a des tables avec des références de clés étrangères à la table que vous essayez de supprimer/tronquer.

Avant de tronquer les tables Il suffit de:

SET FOREIGN_KEY_CHECKS=0;

Tronquez vos tables et remplacez-les par

SET FOREIGN_KEY_CHECKS=1;
129
lalit choudhary

Utilisez phpMyAdmin de cette manière:

Vue de la base de données => Tout vérifier (tables) => Vide

Si vous voulez ignorer les vérifications de clé étrangère, vous pouvez décocher la case qui dit:

[] Activer les contrôles de clé étrangère

Vous devez utiliser la version 4.5.0 ou une version ultérieure pour obtenir cette case à cocher.

Ce n'est pas MySQL CLI-fu, mais bon, ça marche!

63
Nemo

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 facilite l’utilisation, par exemple. depuis mysql workbench.

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
23
beach

J'ai trouvé ceci 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 complète).

Je l'ai modifié pour tronquer les tables. Il n'y a pas de "--add-truncate-table" pour mysqldump, donc je l'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

travaille pour moi --edit, corrige une faute de frappe dans la dernière commande

19
mbjungle
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;
13
George Moik

Ceci imprimera 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');
12
Gaurav Gupta

J'ai trouvé très simple de faire quelque chose comme le code ci-dessous, il suffit de remplacer les noms de table par les vôtres. important assurez-vous 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;
12
user3357946
  1. Pour tronquer une table, il faut supprimer les contraintes de clé étrangère mappées sur les colonnes de cette table à partir d'autres tables (en fait, sur toutes les tables de la base de données/schéma spécifique).
  2. Ainsi, toutes les contraintes de clé étrangère doivent être supprimées initialement, suivies de la troncature de table.
  3. Utilisez éventuellement la table d'optimisation (dans mysql, innodb engine esp) pour récupérer l'espace/la taille des données utilisées dans le système d'exploitation après la troncature des données.
  4. 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) Inutile de supprimer et de recréer la base de données/schéma 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.

5
Anand

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 appeler TRUNCATE TABLE avec cette procédure stockée:

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

Ici est un bon article qui développe davantage.

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]

guide d'utilisation de mysqldump de dev.mysql

3
Dostee

Utilisez ceci 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 meilleure façon de passer est en haut de votre fichier, ajoutez cette ligne

SET FOREIGN_KEY_CHECKS=0;

qui dit que nous ne voulons pas vérifier les contraintes de la clé étrangère en parcourant ce fichier.

Il tronquera toutes les tables des bases de données db1 et bd2.

3
Vinod Kumar

ici car je sais ici

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

S'il est impossible de supprimer ou de mettre à jour une ligne parente: une contrainte de clé étrangère échoue

Cela se produit s'il y a des tables avec des références de clés étrangères à la table que vous essayez de supprimer/tronquer.

Avant de tronquer les tables Il suffit de:

SET FOREIGN_KEY_CHECKS=0;

Tronquez vos tables et remplacez-les par

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

2
Jydipsinh Parmar

Non, il n'y a pas de commande unique pour tronquer toutes les tables mysql en même temps. Vous devrez créer un petit script pour tronquer les tables une par une.

ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

2
Bjørn T.

Voici ma variante pour avoir "une déclaration pour tout tronquer".

Premièrement, j'utilise une base de données distincte appelée "util" pour mes procédures stockées auxiliaires. Le code de ma procédure stockée pour tronquer toutes les tables est le suivant:

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 suit:

call util.trunctables('nameofdatabase');

qui est maintenant exactement une déclaration :-)

1
bebbo

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 vais supprimer 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;
1
beach

Je trouve que TRUNCATE TABLE .. a des problèmes avec les contraintes de clé étrangère, même après un NOCHECK CONSTRAINT ALL, j'utilise donc une instruction DELETE FROM. Cela signifie que les germes d'identité ne sont pas réinitialisées, vous pouvez toujours ajouter un DBCC CHECKIDENT pour y parvenir.

I Utilisez le code ci-dessous pour imprimer dans la fenêtre de message le fichier SQL permettant de 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'''
1
cedd
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 voici comment il est censé être appliqué.

-Kurt

Sur une machine 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, je n'ai donc 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"
  1. système_approbation_externe dépend de la requête_approbation
  2. l'adresse dépend du client
  3. customer_identification dépend du client
  4. external_id dépend du client
  5. les informations d'identification dépendent du client
  6. email_address dépend du client
  7. approbation_request dépend du client
  8. état_client dépend du client
  9. customer_image dépend du client

Répertoriez 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 tables:

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
  1. Adresse de la table de troncature
  2. Tronquer la table assessment_external_system
  3. Troncation de la table approbation_réquation
  4. Table de troncature pays
  5. Tronquer les informations d'identification de la table
  6. Table de troncature client
  7. Table de troncature identifiant_client
  8. Table de tronquage customer_image
  9. Troncation de la table customer_status

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 machine 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
0
Kurt Larsen

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 terminé, vous pouvez supprimer l'ancienne base de données, puis copier à nouveau le schéma de base de données sous l'ancien nom.

0
GJ.

Je sais que ce n'est pas exactement une commande, mais le résultat souhaité peut être obtenu depuis phpMyAdmin en procédant comme suit:

  1. Sélectionner (toutes) les tables à supprimer (cocher tout)
  2. Sélectionnez "Drop"/"Truncate" dans la liste "With selected:"
  3. Sur la page de confirmation ("Voulez-vous vraiment:") copier la requête (tout ce qui a un fond rouge)
  4. Allez en haut et cliquez sur SQL et écrivez: "SET FOREIGN_KEY_CHECKS = 0;" puis collez la requête précédemment copiée
  5. Cliquez sur "Go"

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 en premier lieu, désactivez les contrôles de clé étrangère. Pas de CLI et pas de suppression de la base de données et de l'ajoutant à nouveau.

0
Pavel Mocan
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
0
emanuele

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 

-- modifier ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
0
Angelin Nadar

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

0
Akif

La requête MySQL suivante produira elle-même une requête unique qui tronquera toutes les tables d’une base de données donnée. Il contourne les clés FOREIGN:

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
0