2017-02-14 7 views
3

안녕하세요 저는 더비 임베디드 테이블에 외래 키 제약 조건이 붙어 있습니다. 3 개의 테이블, 즉 객실, 패키지 및 예약이 있습니다.Derby foreign key constraint issue

룸 표 --- 방 ID | RoomName | 임대 | 설명

패키지 테이블 --- pkgId | 이름 | 요금 | 세부 사항

예약 표 --- Id | 손님 ID | pkgId | RoomId | ChkIn | ChkOut | 날짜 |

예약 테이블의 세 외래 키는 GuestID, pkgId 및 roomId입니다.

필자가 원했던 것은 각각의 테이블에없는 일부 값을 받아들이는 외래 키입니다. 예를 들어, 손님이 패키지를 가져 가지 않으면 예약 테이블의 pkgId를 0으로 만들고 싶습니다. 그러나 어떤 이유로 "테이블 'RESERVATION'에 대한 업데이트로 인해 foreign key constraint .. key (0) 위반이 발생했습니다. 그 이유는 0이 Packages 테이블의 값이 아니기 때문입니까? 이상하게도 이전 응용 프로그램에서는 문제가되지 않았습니다. Derby가 새로운 jar 파일로 뭔가를 바 꾸었습니까? 또는이 문제를 어떻게 해결할 수 있습니까? RoomId와 pkgId 둘 다 외래 키 제약 조건을 유지하면서 어떤 시점에서 예약 테이블에 0을 허용하기를 원합니다. 누구든지 나를 도울 수 있습니까? 미리 감사드립니다!

+1

null을 사용하여 어느 패키지 테이블에 새로운 레코드를 삽입한다 0, '손님이 패키지를 가져 오지 않습니다')'또는 외래 키를 제거하거나 NULL 값을 사용하십시오. 외래 키는 "외래 키 값 **은 항상 ** 참조 된 테이블에 존재해야합니다."라는 제약 조건입니다. – krokodilko

+0

새로운 행을 삽입하고 해당 행을 최종 사용자로부터 숨길 것이라고 생각합니다. 그러나 이전 Derby 버전에서 어떻게 작동하는지 잘 모르겠습니다. 고맙습니다. – Thomson

답변

2

SQL에서 0은 다른 값과 마찬가지로 유효한 값입니다. 따라서 FK 열로 0을 설정하면 관련 테이블에서 0이있는 행을 찾습니다. 당신이 다른 테이블에 아무런 관련 행이 없음을 표시하려면

, 당신은 => '(패키지 (pkgid, 이름) 값으로 삽입 ID로

+0

아쉽게도 null 값을 삽입 할 수 없습니다. 하지만 이전 버전의 더비 버전에서는 0 값이 제대로 작동하지 않아 혼란 스러웠습니다. 어쨌든 사실을 확인해 주셔서 감사합니다. – Thomson