【问题标题】:Invalid FK and PK reference无效的 FK 和 PK 参考
【发布时间】:2011-11-15 15:00:25
【问题描述】:

当我为所需表标记主键引用时,无法创建表,因为 oracle 显示“此列列表没有匹配的唯一键或主键”。

第一个表创建成功:

CREATE TABLE TEST
  (
    TESTno VARCHAR2(6) NOT NULL,
    ExamNo VARCHAR2(6) NOT NULL,
    TEST_Date DATE NOT NULL,
    ACTUAL DATE,
    PREDICTED Date,
    CONSTRAINT TESTPKs PRIMARY KEY (TEST_Date, TESTno, ExamNo),
    CONSTRAINT TTESTNO_Fk FOREIGN KEY (TESTno) REFERENCES TESTPAPER (Flightno)
    CONSTRAINT TEXAMNo_FK FOREIGN KEY (ExamNo) REFERENCES Exam (ExamNo)
  );

这是我要创建的表并给了我错误:

CREATE TABLE Assignment
  (
    TEST_Date DATE NOT NULL,
    ExamNo VARCHAR2(6) NOT NULL,
    TestNo VARCHAR2(6) NOT NULL,
    Type  VARCHAR2(20),
    Hours_Spent Decimal(4,2),
    CONSTRAINT ASSIGNPKS PRIMARY KEY (TEST_Date, TestNo , ExamNo),
    CONSTRAINT ASSIGNTESTDATE_FK FOREIGN KEY (TEST_Date) REFERENCES TEST(TEST_Date) ON
  DELETE CASCADE,
    CONSTRAINT ASSIGNTESTNO_FK FOREIGN KEY (TESTno) REFERENCES TESTPAPER (Flightno)
    CONSTRAINT TEXAMNo_FK FOREIGN KEY (ExamNo) REFERENCES Exam (ExamNo)
  );

我可以知道它一直没有给我匹配的唯一主键的问题在哪里吗?我已经尝试重新创建并将“test_Date”标记为我的主键。但是oracle似乎找不到。

谢谢

【问题讨论】:

    标签: sql oracle foreign-keys reference primary-key


    【解决方案1】:

    您指的 PK 是 PRIMARY KEY (TEST_Date, TESTno, ExamNo) — 因此外键也应该是 FOREIGN KEY (TEST_Date, TESTno, ExamNo)。您遇到的错误是由于您尝试引用 TEST PK 的一部分。

    另见http://download.oracle.com/docs/cd/B10500_01/server.920/a96524/c22integ.htm

    【讨论】:

    • +1 完全正确 - 如果 PK 是复合索引(多列),则 每个 FK 引用它必须 还包含 所有这些列
    • 但我想将我的 (TEST_Date, TestNo , ExamNo) 作为我的 PK 和 FK,但从不同的表中引用。有可能吗?
    • 唯一的方法是在您希望在另一个表的外键约束中引用的 PK 的每个组件上创建一个唯一键。
    • 好的,我明白了。设法为我的表创建一个唯一索引并更改约束。谢谢
    【解决方案2】:

    检查您在外键中引用的表。这些列必须是主键或在外部表上是唯一的。

    【讨论】:

    • 是的,您可以看到我的表 test 'test_Date' 已被定义为主键。在我的分配表中,我引用了它并将其标记为主键。但错误仍然发生。
    • 我没有看到其他表,但是 TEST 的主键是 (TEST_Date, TESTno, ExamNo) 并且您只在外键中使用 (TEST_Date)。其他表也可能存在问题,这就是为什么我给出一个通用的响应来检查外键列是否必须匹配主键或外表上的唯一索引。抱歉,如果回复太简洁了。
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多