2012-08-10 2 views
10

우리는 수백 개의 테이블이있는 데이터베이스를 가지고 있습니다. foreign_keys를 사용하는 테이블은 INNODB를 사용합니다.MySQL이 유효하지 않은 외래 키를 찾는다

때때로 우리는 개발, 단계 및 프로덕션 데이터베이스간에 데이터 (mysqldump을 사용하는 개별 테이블)를 전송합니다. mysqldump은 데이터를 쉽게 가져올 수 있도록 모든 외부 키 검사를 비활성화합니다.

시간이 지남에 따라 일부 비 프로덕션 데이터베이스는 고아 레코드로 끝납니다.

전체 MySQL 데이터베이스에 대해 잘못된 키 (누락 된 레코드를 가리키는 키) 외래 키를 찾고 발견하는 스크립트를 작성하려고했습니다.

각 테이블과 fkey를 하나씩 확인하는 쿼리를 작성할 수 있지만 이미 이것을 수행 할 수있는 툴이있을 수 있다고 생각했습니다.

이미 스크립트가 있는지 확인하기 위해 스크립트를 작성하기 전에 확인합니다.

검색된 Google ... 놀랍게도 나는 아무 것도 발견하지 못했습니다. 데이터가 이미 당신이 부모를 삭제하는 FK 제약이나 폭포를 설정하지 않은 경우

+0

'무효'란 무엇을 의미합니까? 고아 레코드? 더 이상 존재하지 않는 테이블을 가리키는 FK가있는 테이블? –

+0

참조 무결성을 유지하기 위해 데이터베이스에서 자동으로이를 수행하고 (사용중인 DB 엔진에 따라 다름) CASCADE를 사용하도록 설정할 수 있습니다. –

+0

stefans 덧글 이외에 아이를 무효화하거나 업데이트 할 수 있다는 점에 유의하십시오. 삭제하지 않아도됩니다. – TomDunning

답변

12

는 그냥 원하는 : 내가 만든

SELECT * FROM children WHERE my_fk_id NOT IN (select id from parents); 
+1

'SELECT t1. * FROM table1 t1 LEFT JOIN 테이블 2 t2 ON t1.parent_id = t2.id where t2.id IS NULL' – DavidS

+0

@Isotope 데이터는 이미 들어 있지만 이미 fk 제약 조건이 있습니다. –

+0

이것은 테이블에서 유효하지 않은 키를 찾는 데 유용합니다. 그러나, 전체 데이터베이스에서 모든 테이블에 대해 이러한 도구를 찾는 도구를 찾고 있습니다. –

관련 문제