所以我正在练习一些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来实现它
*原因:CREATE/ALTER TABLE语句中的REFERENCES子句给出了一个列表,在该表中,引用的表中没有匹配的唯一或主键约束.
问题是EMP_ID(单独)不是表的主键或唯一键Employees,而是有一个复合主键(EMP_ID, EXPERT_ID).
要解决问题,要么创建表EMP_ID的主键Employees(这似乎是直观的,因为每个员工应该具有唯一的ID)或添加单独的唯一约束EMP_ID.
正如评论中所指出的,如果你制作EMP_ID主键,那么 (EMP_ID, EXPERT_ID)扩展也是唯一的.
| 归档时间: |
|
| 查看次数: |
2768 次 |
| 最近记录: |