【问题标题】:"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 来制作它

【问题讨论】:

  • 如果您使用代理键和这些键对的唯一索引,您的生活将会简单得多
  • 嗯。这些是代理键。

标签: sql oracle unique


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2023-04-03
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多