MySQL DROP toutes les tables, ignorant les clés étrangères
y a-t-il un moyen facile de faire tomber toutes les tables d'une base de données MySQL, en ignorant toutes les contraintes de clé étrangère qui peuvent y être?
21 réponses
j'ai trouvé l'ensemble généré des déclarations de chute utile, et recommande ces modifications:
- limitez les gouttes générées à votre base de données comme ceci:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
Note: Ceci n'exécute pas les DROP statements, il vous donne juste une liste d'entre eux. vous aurez besoin de couper et coller la sortie dans votre moteur SQL pour les exécuter.
- Note, par http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , tomber avec cascade est inutile/ trompeur:
"RESTREINDRE et CASCADE sont autorisés à effectuer le portage plus facile. Dans MySQL 5.5, ils ne font rien."
par conséquent, pour que les instructions de largage fonctionnent si vous avez besoin:
SET FOREIGN_KEY_CHECKS = 0
ceci désactivera les contrôles d'intégrité référentiels-so lorsque vous avez terminé d'effectuer les gouttes dont vous avez besoin, vous pouvez réinitialiser la clé de vérification avec
SET FOREIGN_KEY_CHECKS = 1
- L'exécution finale devrait ressembler à:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
NB: pour utiliser la sortie de SELECT easier, l'option mysql-B peut aider.
de 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 ceci répond à la façon de désactiver les vérifications de clés étrangères afin de pouvoir laisser tomber les tables dans l'ordre arbitraire. Il ne répond pas à la question de savoir comment générer automatiquement des instructions drop-table pour toutes les tables existantes et les exécuter dans un seul script. la réponse de Jean does.)
Voici la procédure stockée de SurlyDre modifiée pour 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`;
à Partir 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;
ceci supprime les tableaux de la base de données actuellement utilisée. Vous pouvez définir la base de données actuelle en utilisant use
.
ou autrement, 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 des coups de pied dans le dos pour échapper au Spécial les caractères en db et les noms de table.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
chaque approche ci-dessus inclut beaucoup plus de travail que celui-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
Voici une solution basée sur le curseur. Un peu long, mais fonctionne comme un lot unique 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`;
Vous pouvez le faire:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
lancez ensuite les requêtes générées. Ils laisseront tomber chaque table sur la base de données actuelle.
ici est de l'aide sur drop table
commande.
j'ai apporté cette modification à la réponse de Dion Truter pour la 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';
renvoie l'ensemble dans un seul champ, vous pouvez donc copier une seule fois et supprimer toutes les tables (utilisez Copy Field Content (unquoted)
dans L'établi). Si vous avez beaucoup de tables, vous pouvez frapper quelques limites sur GROUP_CONCAT()
. Dans l'affirmative, augmenter la variable max len (et max_allowed_packet
, si nécessaire).
Voici une façon automatisée de le faire via un script bash:
host=
dbName=
user=
password=
if [ -z "" ]
then
host="localhost"
fi
# drop all the tables in the database
for i in `mysql -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do echo $i && mysql -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 qui supporte la tuyauterie, echo 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.
one liner à abandonner toutes les tables d'une base de données:
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 ceci supprimera toutes les tables de DATABASE DATABASE_NAME.
et une bonne chose à ce sujet est que le nom de la base de données n'est écrit explicitement qu'une fois.
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 VOTREDB au nom de votre base de données, et évidemment 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 acheminera immédiatement vers une seconde instance client qui supprimera les tables.
le morceau intelligent est bien sûr copié à partir d'autres réponses ici - je voulais juste une copie-et-pasteable one-liner (ish) pour réellement do le travail que L'OP voulait.
Note bien sûr, vous devrez mettre vos identifiants en (deux fois) dans ces commandes mysql, aussi, à moins que vous n'ayez une configuration très basse sécurité. (ou vous pouvez alias votre commande mysql pour inclure vos creds.)
googler sur le sujet m'amène toujours à cette question donc voici le code mysql de travail qui supprime à la fois les tables et les 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`;
S'appuyant sur la réponse de @Dion Truter et @Wade Williams, le script shell suivant fera tomber toutes les tables, après avoir d'abord montré ce qu'il est sur le point d'exécuter, et vous donner une chance d'avorter 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}
vient de mettre ici quelques utiles commentaire fait par Jonathan Watt pour laisser tomber 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 `" "`;"}' | $MYSQL
unset MYSQL
Il m'aide et j'espère qu'elle pourra être utile
C'est un assez vieux post, mais aucune des réponses ici vraiment répondu à la question, à mon avis, donc j'espère que mon post va aider les gens!
j'ai trouvé cette solution sur une autre question qui fonctionne vraiment 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
qui videra toutes vos tables dans la base de données DB_NAME
, et pas seulement afficher la ligne de commande TRUNCATE
.
Espérons que cette aide!
cette solution est basée sur la réponse de @SkyLeach mais avec le soutien de déposer des 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"
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 la totalité de la déclaration IF (j'aime la sécurité ajoutée).
"151910920 de la" Meilleure solution pour moi jusqu'à présent
sélectionnez base de données -> clic droit -> tâches -> générer des Scripts - ouvrira assistant pour générer des scripts. Après avoir choisi des objets dans l'option set Scripting, cliquez sur bouton Avancé . Sous "script DROP and CREATE" sélectionnez Script DROP .
Exécuter script.