Existe-t-il un moyen simple et facile de supprimer toutes les tables d'une base de données MySQL, en ignorant les contraintes de clé étrangère qui peuvent s'y trouver?
Drop
dans le menu déroulant, vous pouvez décocher la Foreign key check
case.
Existe-t-il un moyen simple et facile de supprimer toutes les tables d'une base de données MySQL, en ignorant les contraintes de clé étrangère qui peuvent s'y trouver?
Drop
dans le menu déroulant, vous pouvez décocher la Foreign key check
case.
Réponses:
J'ai trouvé l'ensemble généré d'instructions drop utile et recommande ces modifications:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
Remarque 1: cela n'exécute pas les instructions DROP, il vous en donne juste une liste. Vous devrez couper et coller la sortie dans votre moteur SQL pour les exécuter.
Remarque 2: si vous avez des VUES, vous devrez corriger chaque DROP TABLE `VIEW_NAME`
instruction DROP VIEW `VIEW_NAME`
manuellement.
"RESTRICT et CASCADE sont autorisés à faciliter le portage. Dans MySQL 5.5, ils ne font rien."
Par conséquent, pour que les instructions drop fonctionnent si vous avez besoin:
SET FOREIGN_KEY_CHECKS = 0
Cela désactivera les vérifications d'intégrité référentielle - donc lorsque vous aurez terminé d'effectuer les suppressions dont vous avez besoin, vous voudrez réinitialiser la vérification des clés avec
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
NB: pour utiliser plus facilement la sortie de SELECT, l'option mysql -B peut vous aider.
DROP DATABASE foo; CREATE DATABASE foo;
, c'est ce qui n'est pas tout à fait le même mais qui a fonctionné pour moi.
Depuis http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;
(Notez que cela explique comment désactiver les vérifications de clés étrangères afin de pouvoir supprimer les tables dans un ordre arbitraire. Il ne répond pas comment générer automatiquement des instructions drop-table pour toutes les tables existantes et les exécuter dans un seul script. Réponse de Jean Est-ce que.)
Voici la procédure stockée de SurlyDre modifiée afin que les clés étrangères soient ignorées:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
_tableName
avec des citations. Sinon, il échouera sur certains tableaux comme group
ou sur d'autres mots clés.
chaque approche ci-dessus comprend beaucoup plus de travail que celle-ci AFAICT ...
( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql
mysqldump
vers mysql
, sans passer par un fichier?
mysqldump
en grep
en mysql
, cela fonctionne. Merci encore pour votre solution, c'est bien.
De cette réponse ,
exécuter:
use `dbName`; --your db name here
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SET GROUP_CONCAT_MAX_LEN=32768;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables, '') INTO @tables;
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Cela supprime les tables de la base de données actuellement utilisée. Vous pouvez définir la base de données actuelle à l'aide de use
.
Ou sinon, la réponse acceptée par Dion est plus simple, sauf que vous devez l'exécuter deux fois, d'abord pour obtenir la requête, et ensuite pour exécuter la requête. J'ai fourni quelques back-ticks idiots pour échapper aux caractères spéciaux dans les noms de db et de table.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
Voici une solution basée sur un curseur. Un peu long mais fonctionne comme un seul lot SQL:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
Tu peux faire:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
Exécutez ensuite les requêtes générées. Ils supprimeront chaque table de la base de données actuelle.
Voici de l' aide sur drop table
commande.
||
est défini comme étant l'opérateur de concaténation. Plus spécifiquement, le mode SQL MySQL contient PIPES_AS_CONCAT
. Référence: dev.mysql.com/doc/refman/5.0/en/…
concat
place de||
J'ai proposé cette modification sur la réponse de Dion Truter pour le rendre plus facile avec de nombreux tableaux:
SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n',
GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
SEPARATOR ';\n'),
';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';
Cela renvoie le tout dans un seul champ, vous pouvez donc copier une fois et supprimer toutes les tables (à utiliser Copy Field Content (unquoted)
dans Workbench). Si vous avez BEAUCOUP de tables, vous pouvez atteindre certaines limites GROUP_CONCAT()
. Si c'est le cas, augmentez la variable max len (et max_allowed_packet
, si nécessaire).
Un liner pour supprimer toutes les tables d'une base de données donnée:
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
L'exécution de cette opération supprimera toutes les tables de la base de données DATABASE_NAME.
Et une bonne chose à ce sujet est que le nom de la base de données n'est écrit explicitement qu'une seule fois.
La recherche sur le sujet m'amène toujours à cette question SO donc voici le code mysql qui supprime les DEUX tables et vues:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);
PREPARE stmt1 FROM @stmt_sql1;
PREPARE stmt2 FROM @stmt_sql2;
EXECUTE stmt1;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt1;
DEALLOCATE PREPARE stmt2;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
Voici une façon automatisée de le faire via un script bash:
host=$1
dbName=$2
user=$3
password=$4
if [ -z "$1" ]
then
host="localhost"
fi
# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
Si sous Linux (ou tout autre système prenant en charge la tuyauterie, l'écho et grep), vous pouvez le faire avec une seule ligne:
echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;
Je sais que c'est une vieille question, mais je pense que cette méthode est rapide et simple.
En php, c'est aussi simple que:
$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'YOURDB'";
foreach($pdo->query($query) as $row) {
$pdo->exec($row[0]);
}
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
N'oubliez pas de changer YOURDB pour le nom de votre base de données, et bien sûr l'utilisateur / pass.
Dans un shell Linux comme bash / zsh:
DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
"SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
} | mysql "$DATABASE_TO_EMPTY"
Cela générera les commandes, puis les dirigera immédiatement vers une 2e instance client qui supprimera les tables.
Le morceau intelligent est bien sûr copié à partir d'autres réponses ici - je voulais juste une doublure (ish) copiable et collable pour faire réellement le travail que l'OP voulait.
Notez bien sûr que vous devrez également mettre vos informations d'identification (deux fois) dans ces commandes mysql, sauf si vous avez une configuration de sécurité très faible. (ou vous pouvez alias votre commande mysql pour inclure vos crédits.)
Mettez ici quelques commentaires utiles de Jonathan Watt pour supprimer toutes les tables
MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL
Cela m'aide et j'espère que cela pourrait être utile
Supprimez toutes les tables de la base de données avec une seule ligne depuis la ligne de commande:
mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]
Où [nom_utilisateur], [mot de passe], [nom_hôte] et [nom_base_de_données] doivent être remplacés par des données réelles (utilisateur, mot de passe, nom d'hôte, nom de base de données).
Ceci est un assez vieux post, mais aucune des réponses ici n'a vraiment répondu à la question à mon avis, donc j'espère que mon post aidera les gens!
J'ai trouvé cette solution sur une autre question qui fonctionne très bien pour moi:
mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done
Cela va en fait vider toutes vos tables dans la base de données DB_NAME
, et non seulement afficher la TRUNCATE
ligne de commande.
J'espère que cela t'aides!
En s'appuyant sur la réponse de @Dion Truter et @Wade Williams, le script shell suivant supprimera toutes les tables, après avoir d'abord montré ce qu'il est sur le point d'exécuter, et vous donnant une chance d'interrompre en utilisant Ctrl-C.
#!/bin/bash
DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx
CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"
# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
FROM information_schema.tables
WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}
# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read
# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}
Cette solution est basée sur la réponse @SkyLeach mais avec la prise en charge de la suppression de tables avec des clés étrangères.
echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql
DB="your database name" \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
&& mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
Simple et clair (peut-être).
Ce n'est peut-être pas une solution sophistiquée, mais cela m'a fonctionné et m'a sauvé la journée.
Fonctionné pour la version serveur: 5.6.38 MySQL Community Server (GPL)
Étapes que j'ai suivies:
1. generate drop query using concat and group_concat.
2. use database
3. disable key constraint check
4. copy the query generated from step 1
5. enable key constraint check
6. run show table
Shell MySQL
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0; Query OK, 0 rows affected (0.00 sec)
// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)
mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW tables;
Empty set (0.01 sec)
mysql>
J'utilise ce qui suit avec un serveur MSSQL:
if (DB_NAME() = 'YOUR_DATABASE')
begin
while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
declare @sql nvarchar(2000)
SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
exec (@sql)
PRINT @sql
end
while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
begin
declare @sql2 nvarchar(2000)
SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
FROM INFORMATION_SCHEMA.TABLES
exec (@sql2)
PRINT @sql2
end
end
else
print('Only run this script on the development server!!!!')
Remplacez YOUR_DATABASE par le nom de votre base de données ou supprimez l'intégralité de l'instruction IF (j'aime la sécurité supplémentaire).
Jusqu'à présent, la meilleure solution pour moi
Sélectionnez Base de données -> Clic droit -> Tâches -> Générer des scripts - ouvrira l'assistant de génération de scripts. Après avoir choisi les objets dans l'option de script définie, cliquez sur le bouton Avancé . Sous "Script DROP and CREATE", sélectionnez Script DROP .
Script de lancement.