“此列列表没有匹配的唯一键或主键”。主键确实存在
Posted
技术标签:
【中文标题】“此列列表没有匹配的唯一键或主键”。主键确实存在【英文标题】:"no matching unique or primary key for this column-list". The primary key does exist though 【发布时间】:2016-04-10 20:24:59 【问题描述】:所以我正在练习一些 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 来制作它
【问题讨论】:
如果您使用代理键和这些键对的唯一索引,您的生活将会简单得多 嗯。这些是代理键。 【参考方案1】:*原因:CREATE/ALTER TABLE 语句中的 REFERENCES 子句给出了没有匹配的唯一键或主键的列列表 引用表中的约束。
问题在于EMP_ID
(本身)不是表Employees
的主键或唯一键,相反,您有一个复合主键(EMP_ID, EXPERT_ID)
。
要解决此问题,要么将 EMP_ID
设为 Employees
表的主键(这似乎很直观,因为每个员工都应该有一个唯一的 ID),或者在 EMP_ID
上添加一个单独的唯一约束。
正如 cmets 中所指出的,如果您将 EMP_ID
设为主键,那么 (EMP_ID, EXPERT_ID)
也将通过扩展是唯一的。
【讨论】:
如果将 emp_id 设为主键,则对 emp_id、expert_id 的唯一约束将是多余的 - emp_id 本身已经是唯一的。 刚刚从员工表的主键中取出了expert_id,并以某种方式修复了它。【参考方案2】:正如错误提示的那样,您引用外键的列与父表上的唯一约束/pk 不匹配。专门针对主键 EMP_ID,EXPERT_ID 你只引用 EMP_ID。
【讨论】:
以上是关于“此列列表没有匹配的唯一键或主键”。主键确实存在的主要内容,如果未能解决你的问题,请参考以下文章
SQL : ORA-02270: 此列列表没有匹配的唯一键或主键
如何修复 sql 中的“ORA-02270:此列列表没有匹配的唯一键或主键”错误
添加外键约束时遇到问题(错误 ORA-02270:此列列表没有匹配的唯一键或主键)