2016-04-10 6 views
3

So übe ich einige SQL-Codierung für einen Test und ich kann nicht einen Fremdschlüssel zu einem Primärschlüssel verweisen."kein übereinstimmender eindeutiger oder Primärschlüssel für diese Spaltenliste". Der Primärschlüssel existiert jedoch

Hier ist der Tisch, das nicht funktioniert:

CREATE TABLE ASSIGNMENT(
ASSIGN_ID NUMBER(2) NOT NULL, 
START_DATE DATE, 
END_DATE DATE, 
BUDGET NUMBER (10,2), 
MANAGER_ID NUMBER(2), 
    PRIMARY KEY (ASSIGN_ID,MANAGER_ID), 
    FOREIGN KEY (MANAGER_ID) REFERENCES EMPLOYEE(EMP_ID) 
); 

Hier ist die Tabelle es verweist:

CREATE TABLE EMPLOYEE(
EMP_ID NUMBER(2) NOT NULL, 
NAME VARCHAR(40), 
OFFICE VARCHAR(20), 
EXPERT_ID NUMBER(2), 
    PRIMARY KEY (EMP_ID,EXPERT_ID), 
    FOREIGN KEY (EXPERT_ID) REFERENCES EXPERTISE(EXPERT_ID) 
); 

Jedes Mal, wenn ich versuche, um das Skript auszuführen es kommt immer wieder mit:

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

Ich habe mich umgesehen, aber scheint nicht das Problem zu finden. Jede Hilfe wäre willkommen.

Hier ist der vollständige Code (nicht die letzte Tabelle noch nicht getestet):

CREATE TABLE EXPERTISE(
EXPERT_ID NUMBER(2) NOT NULL, 
DESCRIPTION VARCHAR(50), 
HOURLY_RATE NUMBER(3,2), 
CHARGE_RATE NUMBER(3,2), 
    PRIMARY KEY(EXPERT_ID) 
); 

CREATE TABLE EMPLOYEE(
EMP_ID NUMBER(2) NOT NULL, 
NAME VARCHAR(40), 
OFFICE VARCHAR(20), 
EXPERT_ID NUMBER(2), 
    PRIMARY KEY (EMP_ID,EXPERT_ID), 
    FOREIGN KEY (EXPERT_ID) REFERENCES EXPERTISE(EXPERT_ID) 
); 

CREATE TABLE ASSIGNMENT(
ASSIGN_ID NUMBER(2) NOT NULL, 
START_DATE DATE, 
END_DATE DATE, 
BUDGET NUMBER (10,2), 
MANAGER_ID NUMBER(2), 
    PRIMARY KEY (ASSIGN_ID,MANAGER_ID), 
    FOREIGN KEY (MANAGER_ID) REFERENCES EMPLOYEE(EMP_ID) 
); 


CREATE TABLE ALLOCATION(
EMP_ID NUMBER(3) NOT NULL, 
ASSIGN_ID NUMBER(3) NOT NULL, 
DAYS_WORKED_ON DATE, 
HOURS_WORKED_ON DATE, 
    PRIMARY KEY(EMP_ID,ASSIGN_ID), 
    FOREIGN KEY(EMP_ID) REFERENCES EMPLOYEE(EMP_ID), 
    FOREIGN KEY(ASSIGN_ID) REFERENCES ASSIGNMENT(ASSIGN_ID) 
); 

Ich bin mit Oracle SQL Developer machen

+1

Ihr Leben wird viel einfacher sein, wenn Sie Ersatzschlüssel plus eindeutige Indizes für diese Schlüsselpaare verwenden – Bohemian

+0

Um. Das sind Ersatzschlüssel. –

Antwort

6

*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.

Das Problem, dass EMP_ID ist (durch selbst) ist kein primärer oder eindeutiger Schlüssel der Tabelle Employees, stattdessen haben Sie einen zusammengesetzten Primärschlüssel (EMP_ID, EXPERT_ID).

Um das Problem zu beheben, entweder EMP_ID den Primärschlüssel der Tabelle Employees machen (die als jeder Mitarbeiter intuitiv scheinen sollte eine eindeutige ID hat) oder eine separate eindeutige Einschränkung auf EMP_ID hinzufügen.

Wie in den Kommentaren hervorgehoben, wenn Sie EMP_ID den Primärschlüssel machen, dann wird (EMP_ID, EXPERT_ID) auch durch Erweiterung einzigartig sein.

+2

Wenn emp_id zum Primärschlüssel gemacht wird, wäre eine eindeutige Einschränkung für emp_id, expert_id redundant - emp_id wäre bereits allein einzigartig. – mathguy

+0

@mathguy du hast Recht, danke – FuzzyTree

+0

Just nahm expert_id aus Primärschlüssel in der Mitarbeiter-Tabelle und das reparierte es irgendwie. –

1

Wie der Fehler vermuten lässt, stimmt die Spalte, auf die Sie einen Fremdschlüssel verwiesen haben, nicht mit einer eindeutigen Integritätsbedingung/pk in der übergeordneten Tabelle überein. Speziell für den Primärschlüssel EMP_ID, EXPERT_ID referenzieren Sie nur EMP_ID.

Verwandte Themen