2012-03-18 2 views
8

MySQL에서 외래 키를 사용할 때 원본 값이 0이면 ID가 0 인 대상 레코드가 없으므로 오류가 발생합니다. 따라서 원본 열을 NULL로 변경하고 작동합니다. 그러나 이것이 올바른 방법인지 확실하지 않습니다. 그것은 올바른 방법인가요, 아니면 어떻게 든 소스 ID를 NULL 대신 0으로 유지할 수 있습니까?0이 될 수있는 외래 키

+0

'0'또는 'NULL'인 경우 어떤 차이가 있습니까? 논리적 관점에서 볼 때 '0'은 단순히 의미가 없습니다. – Jon

답변

19

외래 키는 제약 조건입니다. 즉, 외래 키가있는 열의 값이 아무것도 설정되지 않고 ("anything"이 NULL을 포함하지 않는 경우) 해당 값이 참조 된 테이블에 존재해야합니다. 그렇지 않으면 MySQL에서 오류가 발생합니다.

그래서, 짧은에, 당신도 외래 키 제약 조건을 제거하고 0을 포함하여 당신이 원하는 무엇이든 할 수있는 값을 설정하거나 참조 된 테이블에 0에 레코드를 추가, NULL에 값을 설정할 수 있습니다. 이 옵션 중 NULL 값을 설정하는 것이 가장 깨끗하게 보입니다.

3

예, 올바른 방법입니다. FK의 핵심은 참조 된 ID가있는 레코드가 실제로 존재하도록하는 것입니다. 따라서 FK 열을 0으로 설정하면 ID가 0 인 레코드가 있어야합니다.

유일한 방법은 FK 열을 NULLable로 만드는 것입니다.

어쨌든 왜 FK 열을 0으로 설정 하시겠습니까? SQL에 "존재하지 않음"에 대한 표준 값은 NULL입니다.

4

올바른 방법입니다. 0은 값이고 null은 열에 아무것도 없음을 나타냅니다.

3

NULL을 사용하면 두 가지 이유로 0보다 낫습니다. 첫째, 그것은 "특별한"값이라는 것을 분명히합니다 (테이블 생성 ID가 항상 자동으로 생성 된 ID에서는 true이지만 테이블 0은 항상 0이 아니어야합니다). 둘째로 외래 키 제약 조건으로 SQL에서 작동합니다.

당신이하는 일은 일반적인 관행입니다. 많은 사람들은 NULL 값을 "누락 값"이라고하는 마커로 사용하며, 이는 SQL의 외래 키 제약 조건에서 기대하는 것입니다.

누락 된 값을 처리하는 다른 방법은 다 대다 관계에서와 같이 두 클래스 사이에 연결이있는 경우에만 항목이있는 세 번째 "연결"테이블을 사용하는 것입니다. 이것은 NULL에 대한 필요성을 피할 수 있으며 일부 데이터베이스 순수 주의자가 선호하지만 모든 것을보다 복잡하게 만듭니다. 자세한 내용은 Nullable Foreign Key bad practice?을 참조하십시오.