所以我正在练习一些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来实现它
答案 0 :(得分:6)
*原因:CREATE / ALTER TABLE语句中的REFERENCES子句给出了一个列表,其中没有匹配的唯一键或主键 引用表中的约束。
问题是EMP_ID
(本身)不是表Employees
的主要或唯一键,而是有一个复合主键(EMP_ID, EXPERT_ID)
。
要解决此问题,请将EMP_ID
作为Employees
表的主键(这似乎很直观,因为每个员工都应具有唯一ID)或在{{1}上添加单独的唯一约束}。
正如评论中所指出的,如果您将EMP_ID
作为主键,那么EMP_ID
也将是唯一的扩展名。
答案 1 :(得分:1)
如错误所示,您引用外键的列与父表上的唯一约束/ pk不匹配。特别是对于主键EMP_ID,EXPERT_ID仅引用EMP_ID。