因此,我正在为测试练习一些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) );
这是它引用的表:
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) );
每当我尝试运行脚本时,它总会返回:
错误报告 -SQL错误:ORA-02270:此列列表 02270没有匹配的唯一或主键。00000-“此列列表没有匹配的唯一或主键” 原因:CREATE / ALTER TABLE中的REFERENCES子句语句 给出了一个列列表,该列列表在被引用的表中没有匹配的唯一键或主键约束。 操作:使用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) );
我正在使用Oracle SQL Developer来做到这一点
*原因:CREATE / ALTER TABLE语句中的REFERENCES子句提供了一个列列表,在被引用的表中没有匹配的唯一或主键约束。
问题在于EMP_ID(本身)不是表的主键或唯一键Employees,而是具有复合主键(EMP_ID, EXPERT_ID)。
EMP_ID
Employees
(EMP_ID, EXPERT_ID)
要解决该问题,可以使表格EMP_ID的主键Employees(这看起来很直观,因为每个员工都应该有一个唯一的ID),或者在上添加一个单独的唯一约束EMP_ID。
正如注释中指出的那样,如果您创建EMP_ID主键,那么 (EMP_ID, EXPERT_ID)扩展名也将是唯一的。