Existe uma maneira fácil e fácil de remover todas as tabelas de um banco de dados MySQL, ignorando quaisquer restrições de chave estrangeira que possam estar lá?
Drop
no menu suspenso, poderá desmarcar a Foreign key check
caixa de seleção.
Existe uma maneira fácil e fácil de remover todas as tabelas de um banco de dados MySQL, ignorando quaisquer restrições de chave estrangeira que possam estar lá?
Drop
no menu suspenso, poderá desmarcar a Foreign key check
caixa de seleção.
Respostas:
Achei o conjunto de instruções drop gerado útil e recomendo estes ajustes:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
Nota 1: Isso não executa as instruções DROP, apenas fornece uma lista delas. Você precisará recortar e colar a saída no seu mecanismo SQL para executá-las.
Nota 2: Se você tiver VIEWs, precisará corrigir cada DROP TABLE `VIEW_NAME`
declaração DROP VIEW `VIEW_NAME`
manualmente.
"RESTRICT e CASCADE têm permissão para facilitar a portabilidade. No MySQL 5.5, eles não fazem nada."
Portanto, para que as instruções drop funcionem, se você precisar:
SET FOREIGN_KEY_CHECKS = 0
Isso desabilitará as verificações de integridade referencial - portanto, quando terminar de executar as descargas necessárias, você deverá redefinir a verificação de chave com
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
Nota: para usar a saída de SELECT mais fácil, a opção mysql -B pode ajudar.
DROP DATABASE foo; CREATE DATABASE foo;
que não é exatamente o mesmo, mas funcionou para mim.
Em 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;
(Note que este respostas como verificação de chaves estrangeiras com deficiência, a fim de ser capaz de eliminar as tabelas em ordem arbitrária. Ele não responde como gerar automaticamente declarações drop-mesa para todas as tabelas existentes e executá-los em um único script. A resposta de Jean faz.)
Aqui está o procedimento armazenado do SurlyDre modificado para que chaves estrangeiras sejam ignoradas:
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
com aspas. Caso contrário, ele falhará em algumas tabelas, como group
outras palavras-chave.
todas as abordagens acima incluem muito mais trabalho do que este 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
para mysql
, sem passar por um arquivo?
mysqldump
para grep
dentro mysql
, ele funciona. Mais uma vez obrigado pela sua solução, é bom.
A partir desta resposta ,
executar:
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;
Isso remove tabelas do banco de dados atualmente em uso. Você pode definir o banco de dados atual usando use
.
Ou, caso contrário, a resposta aceita por Dion é mais simples, exceto que você precisa executá-la duas vezes, primeiro para obter a consulta e depois para executá-la. Forneci alguns back-ticks tolos para escapar de caracteres especiais nos nomes de banco de dados e tabela.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
Aqui está uma solução baseada em cursor. Meio demorado, mas funciona como um único lote 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`;
Você pode fazer:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
Em seguida, execute as consultas geradas. Eles soltarão todas as tabelas no banco de dados atual.
Aqui está alguma ajuda no drop table
comando.
||
está definido como o operador de concatenação. Mais especificamente, o modo SQL do MySQL contém PIPES_AS_CONCAT
. Referência: dev.mysql.com/doc/refman/5.0/en/…
concat
em vez de||
Eu vim com essa modificação na resposta de Dion Truter para facilitar com muitas tabelas:
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';
Isso retorna a coisa inteira em um campo, para que você possa copiar uma vez e excluir todas as tabelas (use Copy Field Content (unquoted)
no Workbench). Se você tiver muitas mesas, poderá atingir alguns limites GROUP_CONCAT()
. Nesse caso, aumente a variável max len (e max_allowed_packet
, se necessário).
Um liner para eliminar todas as tabelas de um determinado banco de dados:
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
A execução disso eliminará todas as tabelas do banco de dados DATABASE_NAME.
E uma coisa boa sobre isso é que o nome do banco de dados é escrito apenas explicitamente uma vez.
A pesquisa no tópico sempre me leva a essa pergunta SO, então aqui está o código mysql que exclui AMBAS tabelas e visualizaçõ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_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`;
Aqui está uma maneira automatizada de fazer isso por meio de um 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 no linux (ou em qualquer outro sistema que suporte tubulação, eco e grep), você pode fazer isso com uma linha:
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;
Sei que essa é uma pergunta antiga, mas acho que esse método é rápido e simples.
No php é tão fácil quanto:
$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');
Lembre-se de alterar o YOURDB para o nome do seu banco de dados e, obviamente, o usuário / passe.
Em um shell Linux como o 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"
Isso irá gerar os comandos e, em seguida, direcioná-los imediatamente para uma segunda instância do cliente que excluirá as tabelas.
Obviamente, a parte mais inteligente é copiada de outras respostas aqui - eu só queria uma linha única copiável e colável (ish) para realmente fazer o trabalho que o OP queria.
Note que é claro que você terá que colocar suas credenciais (duas vezes) nesses comandos mysql também, a menos que você tenha uma configuração de segurança muito baixa. (ou você pode usar o comando mysql para incluir seus creds.)
Basta colocar aqui alguns comentários úteis feitos por Jonathan Watt para descartar todas as tabelas
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
Isso me ajuda e espero que seja útil
Solte todas as tabelas do banco de dados com uma única linha da linha de 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]
Onde [user_name], [password], [host_name] e [database_name] devem ser substituídos por dados reais (usuário, senha, nome do host, nome do banco de dados).
Este é um post bastante antigo, mas nenhuma das respostas aqui realmente respondeu à pergunta na minha opinião, por isso espero que meu post ajude as pessoas!
Encontrei esta solução em outra pergunta que funciona muito bem para mim:
mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done
Isso realmente esvaziará todas as suas tabelas no banco de dados DB_NAME
e não apenas exibirá a TRUNCATE
linha de comando.
Espero que isto ajude!
Com base na resposta de @Dion Truter e @Wade Williams, o seguinte script de shell descartará todas as tabelas, depois de mostrar primeiro o que está prestes a ser executado e dar a você a chance de abortar usando 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}
Esta solução é baseada na resposta do @SkyLeach, mas com o suporte de eliminar tabelas com chaves estrangeiras.
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"
Simples e claro (pode ser).
Pode não ser uma solução sofisticada, mas isso me funcionou e salvou meu dia.
Trabalhou para a versão Server: 5.6.38 MySQL Community Server (GPL)
Etapas que segui:
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>
Eu uso o seguinte com um servidor 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!!!!')
Substitua YOUR_DATABASE pelo nome do seu banco de dados ou remova toda a instrução IF (eu gosto da segurança adicional).
Melhor solução para mim até agora
Selecione Banco de Dados -> Clique com o Botão Direito -> Tarefas -> Gerar Scripts - abrirá o assistente para gerar scripts. Depois de escolher os objetos na opção Definir script, clique no botão Avançado . Em "Script DROP and CREATE", selecione Script DROP .
Execute o script.