외래 키 제약 조건을 무시하고 mysql을 강제로 삭제하십시오.


134

하나를 제외하고 데이터베이스에서 모든 테이블을 삭제하려고하는데 다음과 같은 오류가 발생합니다.

부모 행을 삭제하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패합니다

물론 그 키 제약 조건이 무엇인지 확인하고 결국 모든 테이블을 삭제하기 위해 시행 착오를 할 수는 있지만 모든 테이블을 강제로 삭제하는 빠른 방법이 있는지 알고 싶습니다. 삭제하고 싶지 않습니다).

Google은 다음 방법을 제안하는 일부 사이트를 목표로 삼았습니다.

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

짧은 대답은 더 많은 테이블을 삭제할 수 있지만 동일한 오류가 발생하여 실제로 트릭을 수행하지 않았다는 것입니다. 스택 오버플로 방법에서 모든 외래 키를 특정 테이블에 연결하는 방법을 보았지만 스크립트를 모두 작성하지 않으면 너무 많은 시간이 걸립니다 (다른 옵션이없는 경우 가능)

데이터베이스가 4.1이므로 사용할 수 없습니다 DROP DATABASE

아이디어?


1
질문에 대한 해결책을 제공하지 않는 선택된 답변을 선택한 이유는 무엇입니까?
Sanjay

답변:


-40

데이터 유지에 관심이 없으므로 전체 데이터베이스를 삭제하고데이터베이스 를 작성하십시오.


3
오, 나는 지금 너무 바보 같아서 DATABASE라는 단어를 나중에 추가하는 대신 데이터베이스의 실제 이름으로 대체했습니다. +1
johnnyArt

13
이것은 답변이 아닙니다
Freelancer

8
이 답변이 표시되고
투표

4
@RobertPounder는 이것이 저의 목표였으며이 사이트에 가입 한 이후였습니다. 당신의 관점에 감사드립니다.
Otávio Décio

3
@RobertPounder SO는 OP를 돕는 것 이상의 의미를 지니고 있으며 검색 가능한 "방법"리소스에 해당하며 외래 키 제약 조건 검사를 비활성화해야하기 때문에이 주제에 착륙했으며 Google이 나를 이끌었습니다. 데이터베이스를 삭제하는 것이 OP에 대한 좋은 해결 방법 이었지만 행복하지만 아래 답변은 실제로 "Force drop mysql bypassing foreign key constraint"질문에 대한 대답입니다.
Val Redchenko

404

이것은 검색으로 끝나는 누군가에게 유용 할 수 있습니다. 뷰가 아닌 테이블 을 삭제하려고합니다 .

SET foreign_key_checks = 0;
-테이블 삭제
테이블 삭제 ...
-뷰 삭제
드롭 뷰 ...
SET foreign_key_checks = 1;

SET foreign_key_checks = 0외래 키 검사를 해제 SET foreign_key_checks = 1로 설정하고 외래 키 검사를 다시 설정하는 것입니다. 점검이 해제되어있는 동안 테이블을 제거 할 수 있지만 점검은 테이블 구조의 무결성을 유지하기 위해 다시 설정됩니다.


43
PAT는 내 친구입니다!
SeanDowney

5
이것이 더 나은 정답입니다. 모든 테이블을 삭제하든 몇 개를 삭제하든 문제를 해결합니다. 훌륭한!
Luke Stevenson

@PAT 정말 고마워요. 효과가있었습니다. Mysql Query 브라우저에서는 작동하지 않습니다. 당신은 내 하루를 저장했습니다.
MaNn

나는 전체 데이터베이스 드롭 할 수 없기 때문에 완벽하게 작동, 나는 이것을 사용
파블로 Pazos

1
나는 이것이 일반적으로 올바른 솔루션이지만 질문을 한 @johnnyArt는 구체적으로 이것을 작동하지 않기 때문에 실행 가능한 옵션으로 제외했습니다. 이것이 원래 질문에 대한 정답이 아닌 것 같습니다.
David

18

당신이 사용하는 경우 에 phpMyAdmin을 다음이 기능은 이미 존재한다.

  • 삭제하려는 테이블을 선택하십시오.
  • 테이블 목록의 맨 아래에있는 드롭 다운에서 드롭을 선택하십시오.
  • 하단에 "외국 키 확인"이라는 확인란이있는 새 페이지가 열리면 선택을 취소하십시오.
  • "예"를 수락하여 삭제를 확인하십시오.

3
당신은 내 하루를 구 했어요! 감사! 매력처럼 일했다!
Kami

4

다음 단계를 사용할 수 있으며 제약 조건이있는 테이블을 삭제하는 데 도움이되었으며 위의 설명에서 이미 설명한 솔루션은 방금 스크린 샷을 추가했습니다.여기에 이미지 설명을 입력하십시오


이것은 4 년 전에 게시 된 가장 높은 투표 응답의 사본입니다.
chb

3

Drop 데이터베이스는 모든 버전의 MySQL에 존재합니다. 그러나 테이블 구조를 유지하려면 아이디어가 있습니다.

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

이것은 mysql 명령이 아닌 프로그램입니다.

그런 다음 mysql에 로그인하고

소스 dump.sql;


1

터미널에서 모든 테이블을 한 번에 삭제하는 간단한 솔루션.

이것은 mysql 셸 내부에 몇 단계가 포함되어 있지만 (한 단계 솔루션은 아님), 저에게 도움이되고 하루를 저축했습니다.

서버 버전에서 작동 함 : 5.6.38 MySQL 커뮤니티 서버 (GPL)

내가 따르는 단계 :

 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

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> 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.