2016-03-29 6 views
1

Ich versuche, eine Datenbank in Oracle SQL-Entwickler einzurichten, ich habe diese 3 Tabellen. Ich brauche die Tabelle "GuyAddress", um 3 Primärschlüssel zu haben, die auch alle Fremdschlüssel sind. Hier kommt es zu einem Fehler, den ich nicht verstehen kann.Oracle SQL-Datenbankfehler: "kein übereinstimmender eindeutiger oder Primärschlüssel für diese Spaltenliste"

CREATE TABLE Guy 
( 
    id NUMBER(10) PRIMARY KEY, 
    name   VARCHAR(50) 
); 

CREATE TABLE Address 
(
    zipcode   VARCHAR(6), 
    "number"  NUMBER(10), 
    CONSTRAINT PK_Address PRIMARY KEY(zipcode, "number") 
); 

CREATE TABLE GuyAddress 
(
    Guy_id   NUMBER(10), 
    Address_zipcode VARCHAR(6), 
    Address_number NUMBER(10), 
    CONSTRAINT FK_GuyAddress_Guy_id FOREIGN KEY(Guy_id) REFERENCES Guy(id), 
    CONSTRAINT FK_GuyAddress_Address_zipcode FOREIGN KEY(Address_zipcode) REFERENCES Address(zipcode), 
    CONSTRAINT FK_GuyAddress_Address_number FOREIGN KEY(Address_number) REFERENCES Address("number"), 
    CONSTRAINT PK_GuyAddress PRIMARY KEY(Guy_id, Address_zipcode, Address_number) 
); 

Dies ist der Fehler, hoffentlich jemand den Fehler vor Ort kann ich gemacht, weil ich kann nicht ...

Error starting at line : 18 in command - 
CREATE TABLE "GuyAddress" 
    (
    Guy_id   NUMBER(10), 
    Address_zipcode VARCHAR(6), 
    Address_number NUMBER(10), 
    CONSTRAINT FK_GuyAddress_Guy_id FOREIGN KEY(Guy_id) REFERENCES Guy(id), 
    CONSTRAINT FK_GuyAddress_Address_zipcode FOREIGN KEY(Address_zipcode) REFERENCES Address(zipcode), 
    CONSTRAINT FK_GuyAddress_Address_number FOREIGN KEY(Address_number) REFERENCES Address("number"), 
    CONSTRAINT PK_GuyAddress PRIMARY KEY(Guy_id, Address_zipcode, Address_number) 
) 
Error report - 
SQL Error: ORA-02270: no matching unique or primary key for this column-list 
02270. 00000 - "no matching unique or primary key for this column-list" 
*Cause: A REFERENCES clause in a CREATE/ALTER TABLE statement 
      gives a column-list for which there is no matching unique or primary 
      key constraint in the referenced table. 
*Action: Find the correct column names using the ALL_CONS_COLUMNS 
      catalog view 

Dank!

+1

'CONSTRAINT PK_Address PRIMÄRSCHLÜSSEL (Postleitzahl," Nummer ")' Dies ist kombinierter Primärschlüssel und Sie verwenden 'CONSTRAINT FK_GuyAddress_Address_zipcode FOREIGN KEY (Address_zipcode) REFERENZEN Adresse (Postleitzahl),', die die Ursache sein kann. – ELITE

+0

Ist dies für Oracle (wie der Titel Ihres Beitrags und die Fehlermeldung in der Frage) oder MySQL? Du hast beide markiert. – Boneist

+0

Entschuldigung, das Tag sollte "sql" sein. – SJ19

Antwort

2

Sie keine separaten Fremdschlüssel müssen für jede Spalte in der Primärschlüssel der referenzierten Tabelle - Sie mehrere Spalten in einem Fremdschlüssel haben kann, zB:

CREATE TABLE Guy 
( 
    id NUMBER(10) PRIMARY KEY, 
    name   VARCHAR(50) 
); 

CREATE TABLE Address 
(
    zipcode   VARCHAR(6), 
    address_number NUMBER(10), 
    CONSTRAINT PK_Address PRIMARY KEY(zipcode, address_number) 
); 

CREATE TABLE GuyAddress 
(
    Guy_id   NUMBER(10), 
    Address_zipcode VARCHAR(6), 
    Address_number NUMBER(10), 
    CONSTRAINT FK_GuyAddress_Guy_id FOREIGN KEY(Guy_id) REFERENCES Guy(id), 
    CONSTRAINT FK_GuyAddress_Address FOREIGN KEY(Address_zipcode, Address_number) REFERENCES Address(zipcode,address_number), 
    CONSTRAINT PK_GuyAddress PRIMARY KEY(Guy_id, Address_zipcode, Address_number) 
); 

Beachten Sie, dass ich Ihre address.number Spalte aktualisiert haben zu address.address_number sein, da es nicht empfohlen wird, dass Sie eine Spalte basierend auf einem Schlüsselwort verwenden. Die Verwendung von doublequotes um dies zu umgehen (und auch die Groß-/Kleinschreibung zu beachten) wird ebenfalls nicht empfohlen. Sie müssen daran denken, sie jedes Mal zu verwenden, wenn Sie auf diese Spalte verweisen!

Nebenbei nehme ich an, dass Ihre address Tabelle andere Spalten hat? Die Adressentabelle ist aus heutiger Sicht sinnlos und könnte übersprungen werden!

+0

Jetzt bekomme ich diesen Fehler: Fehler beginnend bei Zeile: 18 in Befehl - Fehlerbericht - SQL-Fehler: ORA-02264: Name bereits von einer vorhandenen Bedingung 02264 verwendet. 00000 - "Name bereits von einer vorhandenen Einschränkung verwendet " * Ursache: Der angegebene Constraint-Name muss eindeutig sein. * Aktion: Geben Sie einen eindeutigen Einschränkungsnamen für die Abhängigkeit an. – SJ19

+0

Sie müssen die Einschränkungen ändern, damit sie nicht den gleichen Namen wie zuvor vorhandene Einschränkungen haben. – Boneist

+0

Auch wenn ich "DROP TABLE GuyAddress CASCADE CONSTRAINTS;" am Anfang? – SJ19

Verwandte Themen