7

내 응용 프로그램의 다음 버전에서 innodb 제약 조건을 사용하여 데이터베이스 무결성을 도입하려고합니다. 모든 것이 잘되지만 일부 테이블에는 삭제 된 참조 (죽은 레코드)가있는 레코드가 있으므로 테이블에 제약 조건을 추가 할 수 없습니다.데이터베이스 무결성 처리

ALTER TABLE `article` ADD FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE; 

내가 얻을 :

내가 노력하고

#1452 - Cannot add or update a child row: a foreign key constraint fails (`books`.<result 2 when explaining filename '#sql-442_dc'>, CONSTRAINT `#sql-442_dc_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE) 

이 쿼리를 실행, 나는 500 개 이상의 레코드를 더 참조가 없다는 것을 발견 (저자가 삭제 된, 그러나 그들의 기사 남아) :

SELECT `articles`.`id` 
FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id` 
WHERE ISNULL(`authors`.`id`); 

제약 조건을 추가하려면 먼저 해당 제약 조건을 처리해야합니다. 위의 쿼리를 사용하여 얻은 모든 레코드를 삭제하려면 어떻게합니까?

DELETE FROM `articles` WHERE `id` IN (
    SELECT `articles`.`id` 
    FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id` 
    WHERE ISNULL(`authors`.`id`); 
) 

을하지만 MySQL은 응답 :

나는 해봤이에

You can't specify target table 'articles' for update in FROM clause 

어떤 도움을 크게 감상 할 수 있습니다.

+0

참조 : http://stackoverflow.com/questions/4770035/handling-database-integrity (duplicate) – Benj

+0

@Benj 왜이 링크를 가리 킵니다 ** 정확한 ** 그래서 게시물? –

+0

@BuhakeSindi 음 ... 내 복사 붙여 넣기에 실패한 것 같습니다 ... 가리켜 주셔서 감사합니다. 미안 해요 (몇 년 후) 원본 링크를 검색 할 수 없습니다. – Benj

답변

14

내가 MYSQL의 많은 단점에 너무 익숙하지 해요,하지만이 또한 작동합니다, 그리고 아마도 MySQL이 거기에 질식되지 않습니다

delete from articles 
where not exists (
      select id from authors 
      where authors.id = articles.author_id 
     ) 

음은 물론 우리는 항상 테이블의 백업이 우리가 세트 기반 삭제를 시도하기 전에 :)

+0

+1, 내 정확한 복제물을 게시 할 필요가 없습니다. – Ronnis

+0

+1 또는 광산 중 하나. –

+0

고마워,이 일은 나를 위해 일했다! 난 이미 임시 테이블을 사용하여 추한 솔루션을 생각해 냈지만,이 하나의 바위 :) 나는 더 많은 upvotes 얻을 수 있도록 잠시 동안 질문을 열어두고 :) –