2017-04-07 46 views
0

我有兩個表我試圖用外鍵創建。 的陳述均低於數據庫創建表主鍵未找到

Book_Copy表

CREATE TABLE book_copy (
    bid   NUMBER(15) NOT NULL, 
    isbn   VARCHAR(15) NOT NULL, 
    firstavaib VARCHAR(9) NOT NULL, 
    outservice VARCHAR(9) NULL, 
    CONSTRAINT primary_key PRIMARY KEY (bid,isbn), 
    FOREIGN KEY (isbn) 
     REFERENCES book_catalog (isbn) 
); 

歷史表

CREATE TABLE history (
    bid   NUMBER(15) NOT NULL, 
    mid   NUMBER(10) NOT NULL, 
    FOREIGN KEY (mid) 
     REFERENCES member (mid), 
    datetaken VARCHAR(9) NOT NULL, 
    datereturn VARCHAR(9) NULL, 
    FOREIGN KEY (bid) 
     REFERENCES book_copy (bid), 
    CONSTRAINT primary_key PRIMARY KEY (bid, datetaken) 
); 

現在,當我運行它的第一個說創建的表,但我得到了第二次以下。

CREATE TABLE history (
    bid   NUMBER(15) NOT NULL, 
    mid   NUMBER(10) NOT NULL, 
    FOREIGN KEY (mid) 
     REFERENCES member (mid), 
    datetaken VARCHAR(9) NOT NULL, 
    datereturn VARCHAR(9) NULL, 
    FOREIGN KEY (bid) 
     REFERENCES book_copy (bid), 
    CONSTRAINT primary_key PRIMARY KEY (datetaken) 

)位於第1行 * ERROR:

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

+0

什麼DB專門 –

+0

甲骨文用sqlplus – Mattps

回答

0

有文中陳述幾個錯誤上述也並非所有的相關資料已經提供

你的表book_copy具有通過isbn列的外鍵引用表book_catalog

CREATE TABLE book_copy (
    ... 
    FOREIGN KEY (isbn) 
     REFERENCES book_catalog (isbn) 

要繼續,我冒昧地添加簡單的一個:

CREATE TABLE book_catalog (
    isbn VARCHAR(15) NOT NULL, 
    CONSTRAINT pk_ct PRIMARY KEY (isbn)); 

相似,他們history表還通過mid列引用另一個表member

CREATE TABLE history (
    ... 
    FOREIGN KEY (mid) 
     REFERENCES member (mid), 

我也營造出一個以繼續:

CREATE TABLE MEMBER (
    mid NUMBER(10) NOT NULL, 
    CONSTRAINT pk_mem PRIMARY KEY (mid)); 

,你得到上面的錯誤意味着什麼,它說:有在其他TABL沒有這樣的主鍵或唯一鍵e,你試圖引用,因此一個值不能被唯一標識,因此數據的完整性沒有被驗證。所以數據庫首先阻止你這樣做。

罪魁禍首是您指定表book_copyPRIMARY KEYbid,isbn而在history表的外鍵引用僅引用bid

CREATE TABLE history (
    ... 
    FOREIGN KEY (bid) 
     REFERENCES book_copy (bid), 

所以你問數據庫上查詢的完整性這些東西不是唯一可識別的。爲了解決這個問題,你必須展開歷史表中的外鍵,包括isbn列,以及:

,所以該完整DDL看起來是這樣的:

CREATE TABLE book_catalog (
    isbn VARCHAR(15) NOT NULL, 
    CONSTRAINT book_catalog_pk PRIMARY KEY (isbn)); 

CREATE TABLE MEMBER (
    mid NUMBER(10) NOT NULL, 
    CONSTRAINT member_pk PRIMARY KEY (mid)); 

CREATE TABLE book_copy (
    bid   NUMBER(15) NOT NULL, 
    isbn   VARCHAR(15) NOT NULL, 
    firstavaib VARCHAR(9) NOT NULL, 
    outservice VARCHAR(9) NULL, 
    CONSTRAINT book_copy_pk PRIMARY KEY (bid,isbn), 
    FOREIGN KEY (isbn) 
     REFERENCES book_catalog (isbn) 
); 

CREATE TABLE history (
    bid   NUMBER(15) NOT NULL, 
    mid   NUMBER(10) NOT NULL, 
    isbn   VARCHAR2(15) NOT NULL, 
    FOREIGN KEY (mid) 
     REFERENCES member (mid), 
    datetaken VARCHAR(9) NOT NULL, 
    datereturn VARCHAR(9) NULL, 
    FOREIGN KEY (bid, isbn) 
     REFERENCES book_copy (bid, isbn), 
    CONSTRAINT history_pk PRIMARY KEY (bid, datetaken) 
); 

。在你的DDL另一個問題以上。在Oracle中,約束名稱是全局唯一的!這意味着無論您在CONSTRAINT之後放置什麼,都必須是唯一的。在上面的情況下,對於兩個表都使用相同的名稱primary_key,在創建歷史記錄表時,該表會失敗,出現ORA-02264: name already used by an existing constraint錯誤。你會看到我已經給了表的主鍵約束更有意義的名字。

+0

謝謝我的問題是,我是從Book_Copy表,列出我的主鍵作爲兩個獨立的外鍵在歷史引用Book_Copy表,合併他們到一個外鍵聲明和它的工作 – Mattps

0

錯誤:外鍵(BID)參考書Book_Copy(BID)

Book_Copy的主鍵是(BID,DateTaken)not ju st(BID)

您需要在另一個表的FK中引用的目標表中的主或唯一約束。

1)添加DateTaken你FK定義對歷史或CHECK約束像更換FK(EXISTS(選擇book_copy C *,其中c.BID = BID)