IT

가짜 외래 키 제약 조건 실패

lottoking 2020. 7. 30. 09:39
반응형

가짜 외래 키 제약 조건 실패


이 오류 메시지가 나타납니다.

40 번째 줄의 오류 1217 (23000) : 부모 행을 삭제하거나 업데이트 할 수 없음 : 외래 키 제약 조건이 실패 함

... 테이블을 삭제하려고 할 때 :

DROP TABLE IF EXISTS `area`;

... 다음과 같이 정의.

CREATE TABLE `area` (
  `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
  `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
  `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  PRIMARY KEY (`area_id`),
  UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

재미있는 점은 이미 외래 키가있는 스키마의 다른 모든 테이블삭제 했다는 것입니다 area. 실제로, area테이블을 제외하고 데이터베이스가 비어 있습니다.

데이터베이스에있는 데이터베이스에 어떤 것이 있습니까? 내가 아는 한 InnoDB는 다른 스키마에서 외래 키를 허용하지 않습니까?

(나는 심지어 RENAME TABLE area TO something_else명령을 수 있습니다 . :-?)


두 가지 가능성 :

  1. FK 참조가있는 다른 스키마 (mysql 용어의 "데이터베이스") 유전자 테이블이 있습니다.
  2. innodb 내부 데이터 딕셔너리는 mysql과 동기화되지 않습니다.

삭제가 실패한 후 "SHOW ENGINE INNODB STATUS"를 수행하여 어떤 테이블인지 (어느 테이블이든) 확인할 수 있습니다.

후자의 경우로 밝혀지면 가능한 경우 전체 서버를 구성하고 복원합니다.

MySQL 5.1 이상에서는 오류 메시지에 FK가 포함 된 테이블 이름이 표시됩니다.


온 디맨드로 이제 답변으로 ...

MySQL Query Browser 또는 phpMyAdmin을 사용하는 경우 각 쿼리마다 새 연결이 열려있는 것 ( bugs.mysql.com/bug.php?id=8280 )으로 인해 모든 드롭 문을 하나의 쿼리에 작성해야합니다.

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE my_first_table_to_drop; 
DROP TABLE my_second_table_to_drop; 
SET FOREIGN_KEY_CHECKS=1; 

SET FOREIGN_KEY_CHECKS=1추가 보안 조치로 사용되는 ...


외래 키 검사

SET FOREIGN_KEY_CHECKS=0

에서이 블로그 :

외래 키 검사를 일시적으로 할 수 있습니다.

SET FOREIGN_KEY_CHECKS=0;

엉망이 복원하십시오.

SET FOREIGN_KEY_CHECKS=1;

잘만 널 그 일

SET foreign_key_checks = 0; 드롭 테이블 table name; SET foreign_key_checks = 1;


Rails에서는 다음을 사용하여 다음을 수행 할 수 있습니다 rails console.

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")

이 테이블로 작업하기 전에 오류가 발생했을 수 있습니다. 테이블 이름을 바꾸고 다시 제거 할 수 있습니다.

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;

쉬운 해결을 찾았고 데이터베이스를 작성 고 텍스트 편집기에서 편집하려는 편집 한 다음 가져옵니다. 끝난


부모 행을 삭제하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패합니다 ( table1. user_role, CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60FOREIGN KEY ( user_id) REFERENCES user( id)).

내가 두 가지 간단한 단계로 수행 한 작업. 먼저 마이어 테이블에서 마이너스 행을 삭제합니다.

mysql> role2id = 2 && user_id = 20;

쿼리 OK, 영향을 받음 1 행 (0.10 초)

부모를 삭제하는 두 번째 단계

id = 20 인 table1에서 삭제;

쿼리 OK, 1 개 행이 영향을 받음 (0.12 초)

이것으로 나는 자식 삭제 다음 부모 삭제를 의미하는 문제를 해결합니다.

나는 당신이 그것을 얻길 바랍니다. :)

참고 URL : https://stackoverflow.com/questions/3334619/bogus-foreign-key-constraint-fail

반응형