내 응용 프로그램의 다음 버전에서 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
어떤 도움을 크게 감상 할 수 있습니다.
참조 : http://stackoverflow.com/questions/4770035/handling-database-integrity (duplicate) – Benj
@Benj 왜이 링크를 가리 킵니다 ** 정확한 ** 그래서 게시물? –
@BuhakeSindi 음 ... 내 복사 붙여 넣기에 실패한 것 같습니다 ... 가리켜 주셔서 감사합니다. 미안 해요 (몇 년 후) 원본 링크를 검색 할 수 없습니다. – Benj