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

346

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.

devang
la source
1
Tronquer toutes les tables? voulez-vous dire tronquer toutes les colonnes de toutes les tables d'une base de données? Dans quel langage de requête s'agit-il? (par exemple SQL, MySQL, Oracle, Postgres, etc.)
Jay
Je ne suis pas sûr que je recommanderais de faire cela car vous pourriez très facilement vous mettre dans le pétrin. Y a-t-il une raison pour laquelle vous ne pouvez pas simplement scripter les tronques et exécuter le script?
GrayWizardx
merci 4 la réponse mais la seule raison pour laquelle le script n'est pas à court de temps, alors pensez à exécuter une requête dans mysql
devang
ya son dans mysql..and requête signifie quelque chose de similaire à truncate table nom_table..ici je veux tronquer toutes les lignes de toutes les tables de ma base de données en une seule requête
devang
Vous pouvez utiliser Information_Schema avec un curseur. Pas sûr de MySql, mais il devrait prendre en charge Information_Schema.Tables
GrayWizardx

Réponses:

340

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

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

Tronquer (c'est-à-dire des tables vides)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
battousaix
la source
17
Ouaip, propre, ty. Mais vous devrez peut-être l'exécuter avec -uUSER -pPASSWORD. Vous devrez peut-être également l'exécuter plusieurs fois si vous avez FK sans suppression sur la cascade.
mihaicc
47
Si vous rencontrez des problèmes FK tels que " Impossible de supprimer ou de mettre à jour une ligne parent: une contrainte de clé étrangère échoue ", assurez-vous de désactiver les vérifications de clé étrangère en modifiant la commande comme suit:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.
24
Pas besoin de boucler le client mysql. Sortez-le de la boucle comme ceci:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Alexander Shcheblikin
2
@TylerCollier vous avez besoin d'un .my.cnf
Felix Eve
2
Sur la base de la réponse et des commentaires ci-dessus, et parce qu'ils ne fonctionnaient pas comme prévu pour moi, j'ai créé un script bash simple que vous pouvez utiliser pour cela. Vous pouvez le trouver sur: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga
145

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;
lalit choudhary
la source
1
C'est probablement la meilleure solution si vous avez un utilisateur et un mot de passe pour votre base de données et que vous ne voulez pas les taper visiblement dans votre shell.
Bach
5
Surévalué car cette solution nécessite uniquement un accès DB et non un accès SSH. De plus, il est indépendant du système d'exploitation.
mastazi
@mastazi j'ai quelques questions: 1. que signifie "table_schema"? se tient-il du nom du schéma? 2.Que signifie TABLE_NAME? représente-t-il les tableaux à supprimer? 3. dois-je écrire les tables à supprimer dans la commande comme "('db1_name', 'db2_name')"?
AAEM
@Ahmed les seules substitutions requises sont que vous devez remplacer db1_name et db2_name par les noms de vos bases de données. Ensuite, vous devez copier les résultats de cette requête, les coller en tant que nouvelle requête mysql et les exécuter. INFORMATION_SCHEMA est un schéma intégré qui est pré-installé dans chaque installation MySQL et contient des informations sur vos bases de données, ne le touchez pas ou votre MySQL commencera à mal se comporter :-) table_schema et table_name sont des colonnes de la table appelée "TABLES" dans information_schema
mastazi
par "db_name", vous voulez dire le nom du schéma? je n'ai qu'un schéma que je veux supprimer ses données de tables
AAEM
67

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!

Nemo
la source
31
qui a dit que nous utilisions PHP ...?
jsh
37
Qui a dit que non? Cette réponse s'avère apparemment utile aux gens; ça aide.
bzeaman
2
Cela ne fonctionnera pas si vous avez un schéma de base de données parent-enfant.
Cary Bondoc
2
La contrainte de clé étrangère échoue.
Brian Hannay
2
@BrianHannay Il a été ajouté dans PMA 4.5.0 en juin 2015. J'ai trouvé le journal des modifications et le problème d'origine
Nemo
24

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
plage
la source
salut..merci pour la réponse d j'ai essayé cette requête mais ne semble pas fonctionner .. c'est quelque chose comme la table tronquée nom_table que je peux utiliser pour toutes les tables de ma base de données ..
devang
J'ai oublié que MySQL ne supporte pas directement l'opérateur "+". En supposant que c'est l'erreur, j'ai ajouté l'exemple CONCAT () ci-dessus. Si vous recevez toujours un message d'erreur, veuillez partager le message d'erreur réel.
plage
cette requête fonctionne mais que se passe-t-il si j'ai un nom de base de données différent, par exemple devang..est mon nom de base de données, donc si je l'utilise en fonction de votre requête ci-dessus, génère l'erreur foll .. La table 'devang.TABLES' n'existe pas
devang
3
Ahh. INFORMATION_SCHEMA est une vue qui existe dans la base de données active. Si vous modifiez votre base de données, la vue sera alors exécutée sur cette base de données. Il n'est pas nécessaire de modifier la requête lors du changement de bases de données. Suivez simplement ces étapes: 1) changez la base de données active. 2) exécutez le script. 3) copiez les résultats 4) collez les résultats dans l'éditeur 5) exécutez les résultats. Toutes les tables de la base de données active sont désormais tronquées.
plage
1
IL FAUT SE MÉFIER! Cela sélectionne toutes les tables de toutes les bases de données (même celles qui ne sont PAS dans la base de données actuelle. L'exemple MySQL ne fonctionne pas, mais dans mon cas, il a renvoyé 293 lignes (tables) au lieu de 66. Imaginez la perte de données ...
f4der
19

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

mbjungle
la source
15
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;
George Moik
la source
Si vous voulez travailler avec la base de données actuelle (et donc rendre ce code portable), changez la dernière condition en SELECTceci:AND table_schema = DATABASE();
alx
Ça ne tronque pas pour moi. MySQL 5.7.25
Lucas Bustamante
14

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;
user3357946
la source
7
vous n'avez pas à répéter SET FOREIGN_KEY_CHECKS = 0; après chaque commande TRUNCATE juste à la ligne de départ qui marquera le mode comme 0
HMagdy
12

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');
Gaurav Gupta
la source
5
  1. Pour tronquer une table, il faut supprimer les contraintes de clé étrangère mappées aux colonnes de cette table à partir d'autres tables (en fait sur toutes les tables du DB / schéma spécifique).
  2. Ainsi, toutes les contraintes de clé étrangère doivent être supprimées initialement, suivies d'une troncature de table.
  3. Facultativement, utilisez la table d'optimisation (dans mysql, innodb engine esp) pour récupérer l'espace / la taille des données utilisées sur 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) 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.

Anand
la source
3

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 TABLEavec 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-tableset --no-datapour 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

Dostee
la source
3

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.

Vinod Kumar
la source
les noms de la base de données devraient être dans qoutes
Roman M
2

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

bebbo
la source
2

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

Jydipsinh Parmar
la source
1

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;
plage
la source
Il m'a fallu beaucoup de temps pour comprendre pourquoi cela ne fonctionnait pas .. Ensuite, un commentaire sur ce fil de discussion électronique a aidé: forums.mysql.com/read.php?61,116597,219343#msg-219343 - Pour référence : "Malheureusement, il semble que les instructions prepare ne puissent pas être utilisées dans les curseurs. Extrait du manuel: dev.mysql.com/doc/refman/6.0/en/… "
Tominator
1

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'''
cedd
la source
0

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.

GJ.
la source
1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Cela créera un fichier sql avec le schéma uniquement (pas de données). Vous pouvez supprimer la base de données après cette commande et pouvez recréer la base de données en important le schéma.
GJ.
0

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:

  1. Sélectionnez (toutes) les tables à supprimer (Tout cocher)
  2. Sélectionnez "Drop" / "Truncate" dans la liste "With selected:"
  3. Sur la page de confirmation ("Voulez-vous vraiment:") copier la requête (tout avec le 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 "Aller"

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.

Pavel Mocan
la source
0
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"
  1. approbation_externe_système dépend de approbation_demande
  2. l'adresse dépend du client
  3. L'identification du client 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_demande dépend du client
  8. customer_status dépend du client
  9. image_client dépend du client

É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
  1. Adresse de table tronquée
  2. Troncature de la table approbation_external_system
  3. Tronquer la table approbation_demande
  4. Pays de la table tronquée
  5. Troncature des informations d'identification de la table
  6. Client de table tronquée
  7. Table tronquée identification_client
  8. Tableau tronqué image_client
  9. Table tronquée 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 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
Kurt Larsen
la source
0

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
Roel van Duijnhoven
la source
0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
emanuele
la source
0

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
Angelin Nadar
la source
1
Cela semble seulement renvoyer la première table: TRUNCATE table1, et oublie toutes les autres tables.
Stephen Smith
Cette solution serait définitivement folle. je ne sais pas pourquoi il n'a pas obtenu de vote. peut être due à mon erreur qui a été modifiée.
Angelin Nadar
0

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

Akif
la source
-1

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
Mark Redman
la source
Cela perd toutes les contraintes, autorisations, vues, etc. sur les tables - ce qui est une nuisance considérable.
Jonathan Leffler
Vous pouvez faire une suppression, puis réamorcer toutes les tables au lieu de tronquer. Je suppose que la baisse est due à la frustration. Restaurez simplement votre sauvegarde.
Mark Redman
-5
<?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.

James Leveille
la source
hey james, je pense que l'OP cherche d'une part un liner .... et d'autre part une commande pour retirer toutes les tables une fois et les supprimer. cela nécessite une sorte d'intervention de l'utilisateur. merci pour le message
Craig Wayne