Oracle
ORA-02270: 此列列表沒有匹配的唯一鍵或主鍵
我收到以下錯誤報告:
錯誤報告 - 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 的一個或多個列。