“no matching unique or primary key for this column-list”. The primary key does exist though

匿名 (未验证) 提交于 2019-12-03 00:56:02

问题:

So i'm practicing some sql coding for a test and I can't get a foreign key to reference a primary key.

Here's the table that doesn't work:

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

Here's the table it is referencing:

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

Whenever I try to run the script it always comes back with:

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

I've looked around but can't seem to find the problem. Any help would be appreciated.

Here's the full code (haven't tested the last table yet):

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

I'm using Oracle SQL Developer to make it

回答1:

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

The problem is that EMP_ID (by itself) isn't a primary or unique key of table Employees, instead, you have a compound primary key (EMP_ID, EXPERT_ID).

To fix the issue either make EMP_ID the primary key of the Employees table (which seems intuitive as each employee ought to have a unique id) or add a separate unique constraint on EMP_ID.

As pointed out in the comments, if you make EMP_ID the primary key, then (EMP_ID, EXPERT_ID) will also be unique by extension.



回答2:

As the error suggest, the column you've referenced a foreign key doesn't match a unique constraint/pk on the parent table. Specifically for the primary key EMP_ID, EXPERT_ID you reference only EMP_ID.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!