2017-09-03 11 views
1

두 개의 테이블이 있습니다. 하나는 BooksRead, 하나는 Authors라고합니다. 저자는 모두 BOTH author_last_name 및 author_first_name의 기본 키를 가지고 있습니다.SQL 외래 키 제약 조건을 추가 할 수 없습니다.

Netbeans IDE를 사용하고 있습니다.

AuthorReader 테이블에는 Author_last_name 및 author_first_name 열이 있으므로 외부 키로 작성자를 참조 할 수 있습니다. 추가/제약 명명 포함 - -

ALTER TABLE BooksRead 
ADD FOREIGN KEY(AUTHOR_LAST_NAME, AUTHOR_FIRST_NAME) 
REFERENCES AUTHORS(AUTHOR_LAST_NAME, AUTHOR_FIRST_NAME); 

나는이 여러 가지 방법을 시도한 같은 오류하지만 항상 얻을 :

[Exception, Error code 30,000, SQLState X0Y45] Foreign key constraint 'SQL170903182055780' cannot be added to or enabled on table BOOKSREAD because one or more foreign keys do not have matching referenced keys.

+1

의 DBMS를 사용하고 있습니까? 더비인가요? – Phil

+1

또한,'BooksRead' 테이블과 같은 소리는 외부 키 제약 조건을 위반하는 데이터를 가지고 있습니다. 즉, Authors에 일치하는 레코드가 없습니다. – Phil

+0

Java DB, Apache Derby. – beh1

답변

0

당신은 확인해야합니다 경우에 기존 데이터 하위 테이블이 기본 키로 상위에 있습니다.

1

BooksRead 테이블과 같은 소리에는 외래 키 제약 조건을 위반하는 데이터가 있습니다. 즉 일치하는 레코드가 Authors에 없습니다.

찾기는 당신에게 BooksRead 행이 일치하는 AUTHOR을 가지고 있지의 목록을 제공합니다 제약

SELECT br.* 
FROM BooksRead br 
WHERE NOT EXISTS (
    SELECT 1 FROM AUTHORS a 
    WHERE a.AUTHOR_LAST_NAME = br.AUTHOR_LAST_NAME 
    AND a.AUTHOR_FIRST_NAME = br.AUTHOR_FIRST_NAME 
) 

를 추가하기 전에 레코드를 수정합니다. 당신도

  • AUTHORS에 해당 행
  • 관련 저자의 세부 정보를 추가 삭제하거나
  • 아마도 BooksRead에서 저자의 세부 사항은 오타 또는 선도/후행 공백이있다. BooksRead 행의 작성자 세부 정보를 수정하여 AUTHORS
+2

AUTHORS 테이블에서 "R. Martin"사이에 공백이있는 항목이 하나 있습니다. "R.R. Martin"이 있어야 했어. 그래서, 당신 말이 맞았습니다. 그것은 제약 조건 이전에 데이터를 추가 할 때 일어난 일이었습니다. 감사! – beh1

+0

@ beh1 지금은 데이터를 정상화하고'AUTHORS' 테이블에서 숫자 ID를 사용하고 복합 키 대신 숫자 ID를 사용하는 것이 좋습니다. – Phil