2009-11-19 2 views
2

내 클라이언트가 최근에 자신의 컴퓨터를 포맷하고 MySQL 서버와 응용 프로그램을 다시 설치했습니다. 그는 마스터 테이블에서 레코드를 삭제해도 하위 테이블에 영향을주지 않는다고 불평했습니다. 나는 그가 데이터베이스 백업을 보내달라고 요청했다. 데이터베이스를 복원 할 때 테이블 엔진이 MyISAM으로 변경되었지만 InnoDB로 변경되었다는 것을 알게되었습니다.MySQL 외래 키 문제

기본 테이블에없는 레코드를 하위 테이블에서 삭제했습니다. 외래 키 인덱스를 다시 설정하지 않을 때 "외래 키 금지가 실패했습니다. 오류 1005"및 때로는 오류 : 150이 표시됩니다.

두 키 중 하나에 남아있을 수있는 행을 두 번 확인했습니다. 기본 테이블이나 자식 테이블에 있지만 아무것도 작동하지 않는 것 같습니다.

기본 테이블에는 기본 키를 결합하여 두 개의 열이 있습니다. 열은 BillNo, BillDate입니다.

도와주세요.

답변

4

이것은 널리 알려진 MySQL 함정입니다. 나는이 문제를 몇 번이나 나 자신에게 부딪혔다. 아마 InnoDB에 문제가있어 백업에서 데이터베이스를 복원했을 것입니다. InnoDB는 작동하지 않았기 때문에 무결성 제약 조건 (외래 키와 같은)을 지원하지 않는 MyISAM 스토리지 엔진으로 떨어졌습니다.

기본적으로 문제는 어떤 이유로 든 InnoDB 엔진이 시작되지 않으면 (일반적으로 구성 문제) - MySQL이 자동으로 MyISAM 엔진으로 폴백합니다. 성명서에 :

이 있다고하더라도, InnoDB가 활성화되어 있지 않으면 MySQL은 기쁜 마음으로 MyISAM 테이블을 만들 것입니다. 바이 바이 데이터 무결성! :)

SHOW ENGINES을 실행하면 어떤 엔진이 작동하는지 확인할 수 있습니다. 자세한 내용은 this MySQL bug report을 참조하십시오.

1
  1. 두 테이블 모두에서 InnoDB 엔진을 사용하고 있는지 확인하십시오.

  2. 두 필드가 모두 동일한 유형이고 색인이되어 있는지 확인하십시오. http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html에서

:

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.