Oracle

ORA-02270: 此列列表沒有匹配的唯一鍵或主鍵

  • December 18, 2017

我收到以下錯誤報告:

錯誤報告 -
SQL 錯誤:ORA-02270:此列列表沒有匹配的唯一鍵或主鍵
02270. 00000 - “此列列表沒有匹配的唯一鍵或主鍵”
*原因:CREATE/ALTER TABLE 語句中的 REFERENCES 子句
 給出沒有匹配的唯一或主要的列列表
 引用表中的鍵約束。
*操作:使用 ALL_CONS_COLUMNS 查找正確的列名
 目錄視圖

我能知道為什麼嗎?

父表

   CREATE TABLE STUDENTINFO
   (
     Student_ID VARCHAR2 (10) PRIMARY KEY,
     Full_Name VARCHAR2 (50) NOT NULL,
     Contact_Number NUMBER (15)NOT NULL,
     Address VARCHAR2 (50) NOT NULL,
     Nationality VARCHAR2 (15) NOT NULL,
     IC_PassportNo VARCHAR2 (15) NOT NULL,
     Programme VARCHAR (75) NOT NULL,
     Email_Address VARCHAR2 (50) NOT NULL REFERENCES                    USERNAMEPASSWORD(Username),
     Parents_Number NUMBER (15)NOT NULL,
     Fingerprint_Template clob
   );

子表

   create table bit_2015_sep_cit4114_fyp_G_
   ( 
     Student_ID VARCHAR2 (10) PRIMARY KEY REFERENCES STUDENTINFO(Student_ID),
     Full_Name VARCHAR2 (50) NOT NULL REFERENCES STUDENTINFO(Full_Name),
     Nationality VARCHAR2 (15) NOT NULL REFERENCES STUDENTINFO(Nationality),
     Fingerprint_Template CLOB NOT NULL REFERENCES        STUDENTINFO(Fingerprint_Template),
    "23/10/2015" VARCHAR2 (15) not null, 
  );

我將國籍和指紋保持為重複,因為根據studentinfo中儲存的所有資訊進行驗證會很耗時,因此進入單獨的班級會更容易和更快。就像表 STUDENTINFO 包含 100 萬條記錄,在表 bit_2015_sep_cit4114_fyp_G_ 中將只有 40 條記錄。我保留國籍列,因為我的表結構中還有 1 列是簽證續簽,它是根據表中的國籍值計算的。

發生錯誤是因為您正在引用另一個表中不唯一的列。Lennart 和 Balazs Papp 已經給出了很好的答案。

我想解釋一下為什麼我們需要父表中的唯一列。正如您所說,您希望在用於外鍵的列中保留重複值,這在創建表時是不可能的。但是您可以創建對包含重複值的現有表的引用。

如果您創建具有非唯一索引和NOVALIDATE選項的主鍵,那麼它是可能的。但這可能會導致令人困惑的結果。

讓我解釋一個情況。

我創建了一個表,其中ID有一列具有非唯一索引的主鍵約束。

SQL>CREATE TABLE t1(id NUMBER);
SQL>CREATE INDEX t1_index on t1(id);
SQL>INSERT INTO t1 VALUES(1);
SQL>INSERT INTO t1 VALUES(1);
SQL>COMMIT;
SQL>SELECT id FROM t1;

   ID
----------
    1
    1

SQL>ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id) USING INDEX t1_index NOVALIDATE;

讓我們創建另一個表來引用第一個表。

SQL>CREATE TABLE t2(id NUMBER, CONSTRAINT t2_fk FOREIGN KEY(id) REFERENCES t1(id));

生成一些記錄。

SQL>INSERT INTO t2 VALUES(1);
SQL>COMMIT;

t2的值1正在引用t1具有重複值的父表1。子表id將引用哪一個?

在上述場景中,外鍵工作正常,但表中的主鍵t1僅適用於新值。

結論: 外鍵必須始終引用在 Oracle 中聲明為 PRIMARY KEY 或 UNIQUE 的一個或多個列。

引用自:https://dba.stackexchange.com/questions/130659