"此列列表没有匹配的唯一键或主键".但主键确实存在

Jor*_*Fox 3 sql oracle unique

所以我正在练习一些sql编码进行测试,我无法获得引用主键的外键.

这是不起作用的表:

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)
);
Run Code Online (Sandbox Code Playgroud)

这是它引用的表:

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)
);
Run Code Online (Sandbox Code Playgroud)

每当我尝试运行脚本时,它总会返回:

错误报告 -
SQL错误:ORA-02270:此列列表
没有匹配的唯一键或主键02270. 00000 - " 此列列表没有匹配的唯一键或主键"
*原因:CREATE/ALTER TABLE中的REFERENCES子句statement
给出了一个列表,在引用的表中没有匹配的唯一或主键约束.
*操作:使用ALL_CONS_COLUMNS目录视图查找正确的列名称

我环顾四周但似乎无法找到问题.任何帮助,将不胜感激.

这是完整的代码(还没有测试过最后一个表):

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)
);
Run Code Online (Sandbox Code Playgroud)

我正在使用Oracle SQL Developer来实现它

Fuz*_*ree 6

*原因:CREATE/ALTER TABLE语句中的REFERENCES子句给出了一个列表,在该表中,引用的表中没有匹配的唯一或主键约束.

问题是EMP_ID(单独)不是表的主键或唯一键Employees,而是有一个复合主键(EMP_ID, EXPERT_ID).

要解决问题,要么创建表EMP_ID的主键Employees(这似乎是直观的,因为每个员工应该具有唯一的ID)或添加单独的唯一约束EMP_ID.

正如评论中所指出的,如果你制作EMP_ID主键,那么 (EMP_ID, EXPERT_ID)扩展也是唯一的.

  • 如果将emp_id作为主键,emp_id上的唯一约束,expert_id将是多余的 - emp_id本身已经是唯一的. (2认同)