“此列列表没有匹配的唯一键或主键”。主键确实存在

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:此列列表没有匹配的唯一键或主键)

此列列表没有匹配的唯一键或主键。我不知道如何为我的情况解决它

oracle中外键的外键[关闭]

MSSQL更新数据,某主键存在则更新,不存在则插入