2011-09-24 9 views
9

카테고리, 언어 및 categories_languages ​​세 가지 테이블이 있습니다. Categories_languages는 카테고리와 언어를 연결하는 many to many 테이블입니다. 테이블 언어에서 foregin 키 값을 업데이트하고 싶습니다만 에러 # 1451이 ​​발생합니다 - 부모 행을 삭제하거나 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패합니다!mysql 데이터베이스에서 외래 키 값을 업데이트하는 방법

CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `name` varchar(20) NOT NULL, 
    `modified` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `languages` (
    `id` char(2) NOT NULL, 
    `name` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `categories_languages` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `category_id` int(11) unsigned NOT NULL, 
    `language_id` char(2) NOT NULL, 
    `translation` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_category_id_language_id` (`category_id`,`language_id`), 
    KEY `fk_language_id` (`language_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE; 

오류가 나에게 분명하지만, 내가 어떻게이 경우에는 키 값을 업데이트 할 수 있습니다?

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

을하지만, 또한 메시지와 함께 실패합니다 : 나는 UPDATA CASCADE ON 추가 시도 MySQL은 말했다 : 문서 # 1005 - 테이블 './db_dodo/#sql-c2f_80e6f.frm'(errno를 : 121) 만들 수 없습니다

+0

업데이트 쿼리가 그 오류를 생성 무엇을 실행하고 있습니까? – bobwienholt

답변

40

일시적 외래 키 검사를 일시 중단 할 수 있습니다 :

SET foreign_key_checks = 0; 
UPDATE languages SET id='xyz' WHERE id='abc'; 
UPDATE categories_languages SET language_id='xyz' WHERE language_id='abc'; 
SET foreign_key_checks = 1; 

편집는 : 외래 키 문제에 관해서는 : 데이터가 로컬 또는 원격 파일 시스템에 저장됩니다? errno 121은 EREMOTEIO (원격 I/O 오류)입니다. 아마도 대상 파일 시스템에 권한 문제가 있거나 파일 이름에 # 문자를 지원하지 않습니다? 당신이 임시 솔루션을 찾고 있다면

+0

안녕하세요. 이것은 도움이되었습니다, 나는 테이블을 업데이트 할 수있었습니다! 여전히 UPDATE CASCADE 제약 조건을 추가하기 위해 테이블 ​​제약 조건을 변경할 수없는 이유를 아직 모릅니다 ...?! –

+1

편집하는 동안 다른 세션의 잘못된 삽입을 방지하기 전에 테이블을 잠그고 잠금 해제해야합니다. –

0

당신은 또한 CASCADEON UPDATE 조치를 변경하고 IDS 수정할 수 있습니다

관련 문제