2014-09-20 4 views
0

MySQL 서버 버전 :대한 설명 - 기본 외래 키 제약 - 이노

vatbands : vatbands에서

`vatbands_id` INT(11) UNSIGNED NOT NULL, 
`client_id` INT(11) UNSIGNED NOT NULL COMMENT 'Customer ID', 
`code` ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL, 
PRIMARY KEY (`vatbands_id`, `code`, `client_id`), 
INDEX `vatcode_vatbands` (`code` ASC, `client_id` ASC) 
ENGINE = InnoDB; 

1 행 :

INSERT INTO `vatbands` (`client_id`, `code`) VALUES ('1', 'A'); 
5.6.17 나는 두 개의 테이블이

품목 :

`client_id` INT(11) UNSIGNED NOT NULL, 
`vatcode` ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL DEFAULT 'A', 
PRIMARY KEY (`item_id`, `client_id`), 
INDEX `vatcode_item` (`vatcode` ASC, `client_id` ASC), 
    CONSTRAINT `vatcode_item` 
    FOREIGN KEY (`vatcode` , `client_id`) 
ENGINE = InnoDB; 

아이에 삽입 (항목) 테이블 :

INSERT INTO `item` (`client_id`, `code`) VALUES ('1', ''); 

나는 vatcode 내가 외래 키 제약 조건 실패 얻을 지정하지 않고 내 항목 테이블에 삽입하려고 :

Cannot add or update a child row: a foreign key constraint fails (`mydb`.`item`, CONSTRAINT `vatcode_item` FOREIGN KEY (`vatcode`, `client_id`) REFERENCES `vatbands` (`code`, `client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

이유는 무엇입니까? vatcode의 기본값을 지정하면 행이 존재하는 한 계속 진행할 수 있습니다.

나는 InnoDB의 설명서를 확인했다 :

14.6.6 이노와 FOREIGN KEY 제약

에 따라 InnoDB 테이블의 외래 키입니다 다음과 같은 조건

참조 동작 :

MySQL 서버가 SET DEFAULT를 허용하는 동안 InnoDB에 의해 이 유효하지 않은 것으로 거부됩니다.

이것이 실패 이유입니까?

UPDATE :

값 직접 PHP 사용 내가 입력하면 예상대로

INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A'); 

제약이 성공한다.

+1

'SET DEFAULT'는 외래 키 제약 조건 동작을 의미한다 :'... DELETE SET의 DEFAULT' ON. – rcdmk

+0

http://sqlfiddle.com/을 작성하여 여기에 링크를 게시하십시오. – rcdmk

+0

@rcdmk 좋습니다. 감사합니다. – Edward

답변

1

외래 키에 대한 SET DEFAULT 절이 하위 테이블에 삽입하는 것과 아무 관련이 없습니다. 상위 테이블의 참조 된 행이 h 제되거나 갱신되는 경우, 하위 테이블의 종속 행을 사용하여 수행 할 작업을 선언합니다.

예 : 직원이 부서에 속하고 부서가 삭제 된 경우 직원도 해고해야합니까? 아니면 다른 "기본"부서에 재 할당해야합니까?

예제를 테스트 한 결과 제대로 작동하지만 부모 테이블에 적어도 client_id을 지정해야합니다.

mysql> insert into items (client_id) values (1); 
Query OK, 1 row affected (0.00 sec) 

(code, client_id)에있는 vatbands의 키가 고유하지 않은 키이기도합니다.실제로는 하위 테이블의 외래 키에서 참조하는 기본 키 또는 고유 키 여야합니다. 사실, MySQL 5.7로 이정표를 테스트 할 때, items 테이블을 생성 할 수도 없습니다.이 점에서 분명히 새로운 버전의 MySQL은 이전 버전보다 엄격하기 때문입니다. 그래서 당신의 열쇠를 기본 열쇠로 만들어야했습니다. 그런 다음 테스트가 진행되었습니다.

+0

안녕 빌, 나는 '1로 client_d을 지정했습니다 '두 테이블에서 내 질문을 업데이 트됩니다. – Edward

+0

부모 테이블에서 기본/고유 키를 만드는 방법은 어떻습니까? –

+0

예, 이미 부모 테이블의 기본 키입니다. 질문을 업데이트 할 것입니다. – Edward

0

이 방법을 사용할 수있는 유일한 방법은 PHP를 사용하여 기본값을 삽입하는 것입니다.

INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A'); 

누구든지이 문제를 해결하는 데 주저하지 말고 순수 MySQL 방법을 선호합니다.

0

당신이 사용하는 경우 :

INSERT INTO `item` (`client_id`, `code`) VALUES ('1', ''); 

당신은 NULL하지만 빈 문자열 삽입되지 않습니다.

INSERT INTO `item` (`client_id`, `code`) VALUES ('1', NULL); 

작동합니다

+0

안녕 Gervs,이 내가 시도한 첫 번째입니다! 그것을 한번 더 해줄거야, 환호. – Edward

+0

그래서 열이 NN으로 설정되었고'column vatcode가 null이 될 수 없습니다 '라는 메시지가 표시되어 nullable 필드로 변경되었으므로 필드에'NULL'을 삽입하면 DEFAULT 값을 무시합니다. – Edward