2012-11-28 85 views
0

我在添加一個外鍵時出錯。我有:MYSQL:外鍵錯誤

CREATE TABLE PRODUCT_1(PROD_ID NUMERIC(5) NOT NULL PRIMARY KEY, 
    PROD_NAME CHAR(20), 
    PROD_DESC CHAR(20), 
    PROD_PRICE NUMERIC(20), 
    SIZE_ID NUMERIC(5) NOT NULL, 
    PROD_CAT_ID CHAR(5)); 


CREATE TABLE SIZE( 
    SIZE_ID NUMERIC(5) NOT NULL PRIMARY KEY, 
    SIZE_SMALL CHAR(2), 
    SIZE_MEDIUM CHAR(2), 
    SIZE_LARGE CHAR(2)); 

我嘗試使用添加外鍵:

ALTER TABLE SIZE 添加外鍵(SIZE_ID)引用PRODUCT_1(SIZE_ID)

,但我得到了以下錯誤: ERROR 1005(HY000):無法創建表 './mmmm/#sql-842_33e1.frm'(錯誤:150)

但是,如果我去倒過來,如:

ALTER TABLE PRODUCT_1 添加外鍵(SIZE_ID)引用SIZE(SIZE_ID)

這工作得很好,我不能對任何數據添加到它那裏給我像「不能更新子表」的錯誤。

任何幫助表示讚賞!

+1

'size_id'既不是product_1中的主鍵也不是唯一鍵。一個外鍵只能引用那些。您可能需要在(product_1)中創建(prod_id,size_id)主鍵,並將「prod_id」添加到「size」表中。 –

回答

1

這是正確的。 SIZE_ID是PRODUCT_1中的「外鍵」,因爲它是SIZE表的「主鍵」。嘗試向SIZE添加外鍵約束沒有任何意義。

如果您運行SHOW INNODB STATUS,您會收到一些信息,指出您沒有所需的索引,但從邏輯上講,沒有理由嘗試創建該約束。

但是您確實想在PRODUCT_1上創建約束。此時,您只能在SIZE中輸入PRODUCT_1中的SIZE_ID值,因爲這是典型的「查找表」設計。

1

PRODUCT_1.SIZE_ID在本例中是外鍵,因爲它引用了另一個表SIZE的主鍵。 因此,第二個ALTER TABLE語句是正確的,因爲它是PRODUCT_1表的一個屬性。

現在,在將任何行插入到PRODUCT_1表之前,您應該確保表SIZE已經有一條記錄,並在新行中引用了SIZE_ID。如果數據庫發現您嘗試插入SIZE_表中不存在的SIZE_ID的行,則違反了FOREIGN KEY約束,並且它將不允許您使用。

+0

你重申了我的回答已經說過的話。 – gview