2014-08-28 86 views
0

我有兩個表的問題。數據庫外鍵錯誤

我剛剛創建了一個名爲 「ejemplar」 用下面的SQL代碼表:

CREATE TABLE ejemplar 
(
id_revista INT NOT NULL, 
id_ejemplar INT NOT NULL, 
id_art INT NOT NULL, 
fecha_ejem VARCHAR (30), 
precio_ejem decimal, 
num_pag_ejem INT, 
PRIMARY KEY (id_revista,id_ejemplar,id_art), 
FOREIGN KEY (id_revista) REFERENCES revista (id_rev) 
) 

我想創建一個名爲 「ejem_art」 表下面的SQL代碼:

CREATE TABLE ejem_art(
id_rev INT NOT NULL, 
id_ejem INT NOT NULL, 
id_art INT NOT NULL, 
num_pag INT, 
PRIMARY KEY (id_rev,id_ejem,id_art), 
FOREIGN KEY (id_rev) REFERENCES revista (id_rev), 
FOREIGN KEY (id_ejem) REFERENCES ejemplar (id_ejemplar), 
FOREIGN KEY (id_art) REFERENCES articulo (id_art) 
); 

DBMS是MySQL,正如你所看到的,我在兩個表的PK和FK字段中都有相同類型的數據。

當我在創建表「ejemplar」後嘗試運行第二個SQL代碼時,MySQL顯示了着名的errno:150,它涉及到不同類型的數據甚至不同的引擎而不是InnoDB。

我已經確定這兩件事是正確的(相同的數據類型和相同的引擎),但我仍然無法運行第二個代碼。

希望你能幫助我,因爲我不想因爲這個錯誤而創建一個「Alter Table」。

在此先感謝!

+0

你檢查了其他外鍵嗎?要確定問題不是來自另一個關鍵。 – 2014-08-28 22:59:44

+0

如果您重新創建了已刪除的表,它必須具有符合引用它的外鍵約束的定義。如前所述,它必須具有正確的列名和類型,並且必須在引用的鍵上有索引。如果這些不滿足,MySQL將返回錯誤號1005並引用錯誤消息中的錯誤150。我沒有看到引用鍵上的索引。 – bksi 2014-08-28 23:00:23

+0

是的。其他FK很好。問題是隻有這兩個表 – 2014-08-28 23:00:58

回答

1

您在外鍵中引用的列必須是父表中鍵的最左邊列中的列。

CREATE TABLE parent (A INT, B INT, PRIMARY KEY (A,B)); 

CREATE TABLE child (B INT, FOREIGN KEY (B) REFERENCES parent(B)); /* WRONG */ 

CREATE TABLE child (A INT, FOREIGN KEY (A) REFERENCES parent(A)); /* RIGHT */ 

回覆您的意見:

不要緊什麼順序列在表中定義。重要的是列在PRIMARY KEY約束中列出的順序。外鍵只能引用父鍵的最左邊一列。

在你的父表,你有這樣的主鍵:

PRIMARY KEY (id_revista,id_ejemplar), 

id_revista是最左邊。列id_ejemplar不是最左邊的

因此,子表的外鍵不能做到這一點:

FOREIGN KEY (id_ejem) REFERENCES ejemplar (id_ejemplar), /* WRONG */ 

最好的解決辦法是同時引用id_revista和id_ejemplar。然後,您將引用父代主鍵的一組列,從最左側開始。

FOREIGN KEY (id_rev, id_ejem) REFERENCES ejemplar (id_revista, id_ejemplar), 
+0

這是什麼意思?我很抱歉,我不明白你想說什麼 – 2014-08-28 23:21:47

+0

我添加了一個例子。你可以刷新,看看是否更清楚? – 2014-08-28 23:22:58

+0

我嘗試以下 外鍵(id_rev)參考雜誌(id_rev) 外鍵(id_ejem)參考ejemplar(id_ejem) 外鍵(id_art)參考文獻危象(id_art) 和在父表中的PK是這樣的順序:id_revista INT NOT NULL, id_ejemplar INT NOT NULL, id_art INT NOT NULL, 我仍然無法使它工作 – 2014-08-28 23:32:57