Forçar queda do mysql ignorando a restrição de chave estrangeira

134

Estou tentando excluir todas as tabelas de um banco de dados, exceto uma, e acabo tendo o seguinte erro:

Não é possível excluir ou atualizar uma linha pai: uma restrição de chave estrangeira falha

É claro que eu poderia tentar e errar para ver quais são essas restrições principais e, eventualmente, excluir todas as tabelas, mas gostaria de saber se existe uma maneira rápida de forçar a eliminação de todas as tabelas (pois poderei reinserir aquelas que não deseja excluir).

O Google me direcionou para algum site que sugerisse o seguinte método:

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

A resposta curta é que realmente não funcionou, pois acabei recebendo o mesmo erro enquanto conseguia excluir mais algumas tabelas. Vi em Stack Overflow maneiras de vincular todas as chaves estrangeiras a uma determinada tabela, mas isso consome muito tempo, a menos que eu escreva tudo (o que é possível no caso de não haver outra opção)

Banco de dados é 4.1, então eu não posso usar DROP DATABASE

Ideias?

johnnyArt
fonte
1
Por que você escolheu a resposta selecionada, que nem sequer fornece a solução para sua pergunta?
Sanjay

Respostas:

-40

Como você não está interessado em manter nenhum dado, descarte o banco de dados inteiro e crie um novo.

Otávio Décio
fonte
3
Oh meu, eu me sinto tão idiota agora, eu estava substituindo a palavra DATABASE com o nome real do banco de dados em vez de adicioná-lo mais tarde, graças tanto +1
johnnyArt
13
esta não é a resposta
Freelancer
8
É hilário ver esta resposta foi marcada e upvotes
tom10271
4
@RobertPounder, esse era exatamente o meu objetivo e existe desde que entrei neste site. Eu aprecio o seu ponto de vista.
Otávio Décio
3
O @RobertPounder SO é um pouco mais do que apenas ajudar os OPs, é um recurso "como" pesquisável, cheguei a esse tópico porque precisava desativar as verificações de restrição de chave estrangeira, e o Google me levou aqui. Estou feliz que descartar o banco de dados foi uma boa solução alternativa para o OP, mas a resposta abaixo está realmente correta para a pergunta "Force drop mysql ignorando a restrição de chave estrangeira".
Val Redchenko
404

Isso pode ser útil para alguém que acaba aqui a partir de uma pesquisa. Verifique se você está tentando largar uma mesa e não uma vista .

SET Foreign_key_checks = 0;
- Mesas suspensas
soltar tabela ...
- Soltar visualizações
drop view ...
SET Foreign_key_checks = 1;

SET foreign_key_checks = 0é desativar as verificações de chave estrangeira e SET foreign_key_checks = 1ativar novamente as verificações de chave estrangeira. Enquanto as verificações estão desativadas, as tabelas podem ser descartadas, depois as verificações são ativadas novamente para manter a integridade da estrutura da tabela.

PAT
fonte
43
PAT é meu amigo!
SeanDowney
5
Esta é uma resposta melhor correta. Resolve o problema excluindo todas as tabelas ou apenas algumas. Formidável!
22413 Luke Stevenson
@ Pat Muito obrigado, funcionou. embora não funcione no navegador Mysql Query. Você salvou meu dia.
Mann
funcionou perfeitamente, eu usei este porque eu não posso deixar cair todo o banco de dados
Pablo Pazos
1
Concordo que essa é normalmente a solução certa, mas o @johnnyArt, que fez a pergunta, excluiu especificamente isso como uma opção viável, porque não funcionou para ele. Parece que essa não é a resposta correta para a pergunta original, é?
David
18

Se você estiver usando o phpmyadmin , esse recurso já estará lá.

  • Selecione as tabelas que você deseja soltar
  • Na lista suspensa na parte inferior da lista de tabelas, selecione drop
  • Uma nova página será aberta com a caixa de seleção na parte inferior dizendo "Verificação de chave estrangeira", desmarque-a.
  • Confirme a exclusão aceitando "yes".
Ali Azhar
fonte
3
Você salvou o meu dia! Obrigado! Trabalhou como um encanto!
Kami
4

Você pode usar as etapas a seguir, funcionou para eu soltar a tabela com restrições, solução já explicada no comentário acima, acabei de adicionar a captura de tela para isso -insira a descrição da imagem aqui

srinivas
fonte
Esta é uma duplicata da resposta mais votada, publicada quatro anos antes.
chb
3

O banco de dados descartado existe em todas as versões do MySQL. Mas se você quiser manter a estrutura da tabela, aqui está uma ideia

mysqldump --no-data --add-drop-database --add-drop-table -hHOSTNAME -uUSERNAME -p> dump.sql

Este é um programa, não um comando mysql

Então, entre no mysql e

fonte dump.sql;

MindStalker
fonte
1

Solução simples para descartar toda a tabela de uma só vez do terminal.

Isso envolveu algumas etapas dentro do seu shell mysql (embora não seja uma solução de uma etapa), isso funcionou comigo e salvou meu dia.

Trabalhou para a versão Server: 5.6.38 MySQL Community Server (GPL)

Etapas que eu segui:

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

Shell MySQL

$ mysql -u root -p
Enter password: ****** (your mysql root password)
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> 
Sanjay
fonte