web-dev-qa-db-ja.com

参照されるテーブルには、外部キーの参照列リストに一致する主キーまたは候補キーがありません

SQL Serverでは、このエラーが発生しました->

「参照されたテーブル「BookTitle」には、外部キー「FK _BookCopy _ Title__2F10007B」の参照列リストに一致する主キーまたは候補キーがありません。」

最初に、BookTitle関係という関係を作成しました。

CREATE TABLE BookTitle (
ISBN            CHAR(17)       NOT NULL,
Title           VARCHAR(100)   NOT NULL,
Author_Name     VARCHAR(30)    NOT NULL,
Publisher       VARCHAR(30)    NOT NULL,
Genre           VARCHAR(20)    NOT NULL,
Language        CHAR(3)        NOT NULL,    
PRIMARY KEY (ISBN, Title))

次に、BookCopy関係という関係を作成しました。この関係は、BookTitle関係の主キーTitleを参照する必要があります。

CREATE TABLE BookCopy (
CopyNumber         CHAR(10)            NOT NULL,
Title              VARCHAR(100)        NOT NULL,
Date_Purchased     DATE                NOT NULL,
Amount             DECIMAL(5, 2)       NOT NULL,
PRIMARY KEY (CopyNumber),
FOREIGN KEY (Title) REFERENCES BookTitle(Title))

しかし、上記のエラーが発生したため、BookCopy関係を作成できません。

私はいくつかの有用な助けに本当に感謝しています。

40
user2622438

外部キーは、列を別のテーブルの一意のキーに結合することで機能します。その一意のキーは、プライマリキーまたはその他の一意のインデックスなど、何らかの形式の一意のインデックスとして定義する必要があります。

現時点では、唯一の一意のインデックスは、主キーであるISBN, Titleの複合インデックスです。

BookTitleが保持する内容とその中のデータの関係に応じて、多くのオプションが利用できます。

ISBNはBookTitleの各行に対して一意であると推測するのは危険です。これが事実であるという仮定で、主キーをISBNのみに変更し、タイトルの代わりにISBNを持ち、それに参加するようにBookCopyを変更します。

主キーをISBN, Titleとして保持する必要がある場合は、ISBNをBookCopyに保存し、タイトルと外部キーを両方の列に保存する必要がありますOR BookTitle(Title)に一意のインデックスを一意のインデックスとして作成します。

より一般的には、REFERENCES句に含まれる1つまたは複数の列が親テーブルの一意のインデックスと正確に一致することを確認する必要があります。この場合、Title単独。

55
Chris J

もう1つは、キーが非常に複雑な場合、フィールドの場所を置き換える必要がある場合があります。

この用量が機能する場合:

外部キー(ISBN、タイトル)はBookTitle(ISBN、タイトル)を参照します

次に、これは動作する可能性があります(この特定の例ではなく、一般的に):

外部キー(タイトル、ISBN)はBookTitle(タイトル、ISBN)を参照します

13
Dan

どちらかが必要です

  • BookTitleのタイトルに関する一意のインデックス
  • BookCopyのISBN列とFKは両方の列にあります

外部キーは親行を一意に識別する必要があります。現在、タイトルは一意ではないため、これを行う方法はありません。

6
gbn

BookTitleには複合キーがあります。 BookTitleのキーがforeign keyとして参照される場合、完全な複合キーを用意する必要があります。

したがって、問題を解決するには、BookCopyに完全な複合キーを追加する必要があります。したがって、ISBN列も追加します。そして彼らは最後に。

foreign key (ISBN, Title) references BookTitle (ISBN, Title)
3