2017-03-04 152 views
1

我有以下父表:複合外鍵

create table A(
    a int(64) unsigned not null, 
    b set('a', 'b', 'c') not null default '', 
    c set('d', 'e') not null default '', 
    primary key (a,b,c) 
) 

而且孩子:

create table B(
    d int(64) unsigned not null auto_increment, 
    a int(64) unsigned not null, 
    c set('d', 'e') not null default '', 
    primary key (d), 
    key fk1 (a,c), 
    constraint fk1 foreign key (a, c) references (a, c) 
) 

但後來我得到一個FK錯誤上創建mysql日誌中的子表:

表的外鍵約束出錯外鍵(a,c)引用 A(a,c):無法找到引用表中 引用列顯示爲第一列的索引,或 表中的列類型與被引用表的約束不匹配。

我的SQL有什麼不正確?

+0

圍繞列名稱有單引號。我認爲這是一個錯字,並投票結束這些問題。 –

+0

@GordonLinoff不,我不認爲這是一個錯字。 Ty用於格式化 – user1561108

+0

1.引用的表名缺失。 2.所引用的表格上沒有可以支持FK的索引。 3.在相同的列上引用沒有唯一索引的列(對於引用的表)是一種奇怪的設計。 –

回答

2

定義外鍵時,MySQL要求遠程表中的列存在索引,以便它可以高效地執行約束檢查。

它可以是一個完全引用的列上的索引,或者是一個以被引用的列開始幷包含其他列的索引,所以在你的情況下,表A應該有一個帶有列(a,c)一些其他人。

現在,在表A中有一組列(a,b,c)的索引。 請注意,列的順序很重要,(a,b,c)上的索引不會與(a,c,b)中的索引相同。

FK引用列(a,c)。這些列在表A中沒有索引,或者是以這兩個列開頭幷包含更多列的任何其他索引。

所以,你有兩個選擇:

  1. 修改PK表A是(A,C,B),而不是(A,B,C)。請注意, 在某些情況下,這可能會對您的 查詢產生性能影響,因爲其中一些查詢可能無法使用索引。
  2. 在甲添加一個附加的索引只是這兩個列:

    ALTER TABLE A
    ADD INDEX tempindexac);

+0

即使解決方案是在錯誤日誌中,它會讓我永遠解決它。謝謝@YossiVainshtein – user1561108