C'è un bel modo semplice per eliminare tutte le tabelle da un database MySQL, ignorando eventuali vincoli di chiave esterna che potrebbero esserci?
Drop
dal menu a discesa, puoi deselezionare la Foreign key check
casella di controllo.
C'è un bel modo semplice per eliminare tutte le tabelle da un database MySQL, ignorando eventuali vincoli di chiave esterna che potrebbero esserci?
Drop
dal menu a discesa, puoi deselezionare la Foreign key check
casella di controllo.
Risposte:
Ho trovato utile il set generato di istruzioni di rilascio e consiglio queste modifiche:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
Nota 1: Questo non esegue le istruzioni DROP, ma ti dà solo un elenco di esse. Dovrai tagliare e incollare l'output nel tuo motore SQL per eseguirli.
Nota 2: se hai VISUALIZZAZIONI, dovrai correggere manualmente ciascuna DROP TABLE `VIEW_NAME`
istruzione DROP VIEW `VIEW_NAME`
.
"RESTRICT e CASCADE sono autorizzati a semplificare il porting. In MySQL 5.5, non fanno nulla."
Pertanto, affinché le istruzioni di rilascio funzionino se è necessario:
SET FOREIGN_KEY_CHECKS = 0
Questo disabiliterà i controlli di integrità referenziale - quindi quando hai finito di eseguire i drop di cui hai bisogno, vorrai ripristinare il controllo dei tasti con
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
NB: per usare più facilmente l'output di SELECT, l'opzione mysql -B può essere d'aiuto.
DROP DATABASE foo; CREATE DATABASE foo;
, che non è esattamente lo stesso, ma ha funzionato per me.
Da 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;
(Si noti che questo risponde a come disabilitare i controlli di chiave esterna per essere in grado di eliminare le tabelle in ordine arbitrario. Non risponde a come generare automaticamente le istruzioni delle tabelle di rilascio per tutte le tabelle esistenti ed eseguirle in un singolo script. Risposta di Jean lo fa.)
Ecco la procedura memorizzata di SurlyDre modificata in modo che le chiavi esterne vengano ignorate:
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
con un backquotes. Altrimenti fallirà su alcune tabelle come group
o altre parole chiave.
ogni approccio sopra include molto più lavoro di questo 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
eseguire il pipe mysql
, senza passare attraverso un file?
mysqldump
in grep
in mysql
, funziona. Grazie ancora per la tua soluzione, va bene.
Da questa risposta ,
eseguire:
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;
Questo elimina le tabelle dal database attualmente in uso. È possibile impostare il database corrente utilizzando use
.
O altrimenti, la risposta accettata da Dion è più semplice, tranne per il fatto che è necessario eseguirla due volte, prima per ottenere la query e in secondo luogo per eseguire la query. Ho fornito alcuni stupidi segni di spunta per sfuggire a caratteri speciali nei nomi di database e tabelle.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
Ecco una soluzione basata sul cursore. Un po 'lungo ma funziona come un singolo batch 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 puoi fare:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
Quindi eseguire le query generate. Rilasceranno ogni singola tabella nel database corrente.
Ecco qualche aiuto a drop table
comando.
||
sia impostato come operatore di concatenazione. Più specificamente, contiene la modalità SQL MySQL PIPES_AS_CONCAT
. Riferimento: dev.mysql.com/doc/refman/5.0/en/…
concat
invece di||
Ho escogitato questa modifica sulla risposta di Dion Truter per semplificare l'uso di molte tabelle:
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';
Questo restituisce l'intera cosa in un campo, quindi puoi copiare una volta ed eliminare tutte le tabelle (usa Copy Field Content (unquoted)
in Workbench). Se hai un sacco di tavoli, potresti avere dei limiti GROUP_CONCAT()
. In tal caso, aumentare la variabile max len (e max_allowed_packet
, se necessario).
Una riga per eliminare tutte le tabelle da un determinato database:
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
L'esecuzione di questo eliminerà tutte le tabelle dal database DATABASE_NAME.
E una cosa bella di questo è che il nome del database viene scritto esplicitamente una sola volta.
Googling sull'argomento mi porta sempre a questa domanda SO, quindi qui funziona il codice mysql che elimina ENTRAMBE tabelle e viste:
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`;
Ecco un modo automatizzato per farlo tramite uno 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
Se in linux (o qualsiasi altro sistema che supporta piping, echo e grep) puoi farlo con una riga:
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;
So che questa è una vecchia domanda, ma penso che questo metodo sia rapido e semplice.
In php è facile come:
$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');
Ricorda solo di cambiare YOURDB con il nome del tuo database e ovviamente l'utente / pass.
In una shell Linux come 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"
Ciò genererà i comandi, quindi li instraderà immediatamente a una seconda istanza client che eliminerà le tabelle.
La parte intelligente è ovviamente copiata da altre risposte qui - volevo solo un one-liner (ish) copia e incolla per fare effettivamente il lavoro che l'OP voleva.
Nota che dovrai inserire le tue credenziali (due volte) anche in questi comandi mysql, a meno che tu non abbia una configurazione di sicurezza molto bassa. (o potresti alias il tuo comando mysql per includere i tuoi crediti.)
Inserisci qui alcuni commenti utili fatti da Jonathan Watt per eliminare tutti i tavoli
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
Mi aiuta e spero che possa essere utile
Elimina tutte le tabelle dal database con una singola riga dalla riga di comando:
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]
Dove [user_name], [password], [host_name] e [database_name] devono essere sostituiti con dati reali (utente, password, nome host, nome database).
Questo è un post piuttosto vecchio, ma nessuna delle risposte qui ha veramente risposto alla domanda secondo me, quindi spero che il mio post possa aiutare le persone!
Ho trovato questa soluzione su un'altra domanda che funziona davvero bene per me:
mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done
Ciò effettivamente svuota tutte le tabelle nel database DB_NAME
e non visualizza solo la TRUNCATE
riga di comando.
Spero che sia di aiuto!
Basandosi sulla risposta di @Dion Truter e @Wade Williams, il seguente script shell eliminerà tutte le tabelle, dopo aver prima mostrato ciò che sta per eseguire e dandoti la possibilità di interrompere utilizzando 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}
Questa soluzione si basa sulla risposta @SkyLeach ma con il supporto del rilascio di tabelle con chiavi esterne.
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"
Semplice e chiaro (può essere).
Potrebbe non essere una soluzione elegante, ma questo mi ha funzionato e mi ha salvato la giornata.
Ha funzionato per la versione Server: 5.6.38 MySQL Community Server (GPL)
I passaggi che ho seguito:
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>
Uso quanto segue con un server 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!!!!')
Sostituisci YOUR_DATABASE con il nome del tuo database o rimuovi l'intera istruzione IF (Mi piace la sicurezza aggiunta).
Soluzione migliore per me finora
Seleziona Database -> Clic destro -> Attività -> Genera script - aprirà la procedura guidata per la generazione di script. Dopo aver scelto gli oggetti nell'opzione di scripting impostata, fai clic sul pulsante Avanzate . In "Script DROP and CREATE" selezionare Script DROP .
Esegui script.