2013-07-26 2 views
29

In SQL Server übereinstimmen, bekam ich diesen Fehler ->Es gibt keinen primären oder Kandidatenschlüssel in der referenzierten Tabelle ist, die die Referenzspaltenliste im Fremdschlüssel

„Es gibt keinen primären oder Kandidatenschlüssel in dem referenzierte Tabelle 'BookTitle', die mit der referenzierenden Spaltenliste im Fremdschlüssel übereinstimmen 'FK_ BookCopy _Title__2F10007B'. "

Ich erstellte zuerst eine Beziehung namens BookTitle Beziehung.

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)) 

Dann habe ich eine Beziehung namens BookCopy Beziehung erstellt. Diese Beziehung muss sich auf den Primärschlüssel der Relation BookTitle beziehen, 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)) 

Aber ich kann die BookCopy Beziehung nicht erstellen, weil der oben angegebene Fehler aufgetreten ist.

Ich schätze wirklich einige nützliche Hilfe.

+1

Haben Sie Daten in Tabellen? – Bharadwaj

+0

Mögliches Duplikat von [Es gibt keine Primär- oder Kandidatenschlüssel in der referenzierten Tabelle] (https://stackoverflow.com/questions/12213301/there-are-no-primary-or-candidate-keys-in-the-referenced- Tabelle) –

Antwort

38

Fremdschlüssel funktionieren, indem sie eine Spalte mit einem eindeutigen Schlüssel in einer anderen Tabelle verknüpfen, und dieser eindeutige Schlüssel muss als eine Art eindeutiger Index definiert werden, sei es der Primärschlüssel oder ein anderer eindeutiger Index.

Im Moment ist der einzige eindeutige Index, den Sie haben, eine zusammengesetzte Eins auf ISBN, Title, die Ihr Primärschlüssel ist.

Es gibt eine Reihe von Optionen, die Ihnen zur Verfügung stehen, abhängig davon, was genau BookTitle enthält und wie die Daten darin zusammenhängen.

Ich würde vermuten, dass die ISBN für jede Zeile in BookTitle eindeutig ist. Unter der Voraussetzung, dass dies der Fall ist, ändern Sie Ihren Primärschlüssel, um nur auf ISBN zu sein, und ändern Sie BookCopy so, dass Sie anstelle von Titel ISBN haben und sich diesem anschließen.

Wenn Sie Ihren Primärschlüssel als ISBN, Title behalten möchten, müssen Sie entweder die ISBN in BookCopy sowie den Titel und den Fremdschlüssel in beiden Spalten speichern, ODER Sie müssen einen eindeutigen Index für BookTitle (Titel) erstellen. als eigenständiger Index.

Allgemeiner gesagt, müssen Sie sicherstellen, dass die Spalte oder Spalten, die Sie in Ihrem REFERENCES Klausel Spiel haben genau ein eindeutiger Index in der übergeordneten Tabelle: In Ihrem Fall ist es nicht, weil Sie auf Title einen einzigen eindeutigen Index haben nicht allein .

+0

Der Grund dafür ist, dass wenn Sie einen Fremdschlüssel haben, es nicht die Zieltabelle scannen sollte, um die Beziehung richtig zu machen? – HumbleWebDev

+0

Nein, dies liegt daran, dass Fremdschlüssel konzeptionell immer einer einzelnen Zeile in der übergeordneten Tabelle zugeordnet werden. Dies wird durch eine eindeutige Einschränkung für die Tabelle erzwungen, die bei vielen RDBMS als Index implementiert ist. Aber es muss nicht sein. –

+0

Richtig, ich denke, das ist eine bessere und einfachere Erklärung. – HumbleWebDev

6

Sie müssen entweder

  • einen eindeutigen Index für Titel in Buchtitel
  • Eine ISBN Spalte in Book und FK ist auf beiden Spalten

Ein Fremdschlüssel Bedürfnisse eindeutig die Eltern zu identifizieren Zeile: Sie haben derzeit keine Möglichkeit, das zu tun, weil Titel nicht eindeutig ist.

2

BookTitle haben einen zusammengesetzten Schlüssel. Wenn also der Schlüssel BookTitle als foreign key referenziert wird, muss der komplette zusammengesetzte Schlüssel mitgebracht werden.

Um das Problem zu beheben, müssen Sie den vollständigen zusammengesetzten Schlüssel in BookCopy hinzufügen. Fügen Sie also auch ISBN Spalte hinzu. und sie am Ende.

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

Eine andere Sache ist - wenn Ihre Schlüssel sehr kompliziert sind manchmal braucht man die Orte der Felder ersetzen und es hilft:

wenn diese dosent Arbeit:

Fremdschlüssel (ISBN, Titel) verweist auf Buchtitel (ISBN, Titel)

Dann könnte diese (nicht für dieses spezielle Beispiel arbeiten, aber im allgemeinen):

Fremdschlüssel (Titel, ISBN) refe rences BookTitle (Titel, ISBN)

+3

Danke! Ich bin endlich an diesem dummen Fehler vorbeigekommen. [Wie wichtig ist die Reihenfolge der Spalten in Indizes?] (Https://stackoverflow.com/questions/2292662/how-important-is-the-order-of-columns-in-indexes) erklärt, warum die Reihenfolge wichtig ist. – Darsstar

Verwandte Themen